Index: lams_admin/conf/language/lams/ApplicationResources.properties
===================================================================
diff -u -rba2b4e0d8f708d647ab75bf4db71559dfb249e07 -r394f403c289f0fd7808c228840bead5c4e7d5d32
--- lams_admin/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision ba2b4e0d8f708d647ab75bf4db71559dfb249e07)
+++ lams_admin/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 394f403c289f0fd7808c228840bead5c4e7d5d32)
@@ -1,646 +1,655 @@
-appName = admin
-#language code: en
-#locale code: AU
-
- # Exported from the LAMS Community by Ernie Ghiglione on Sun Mar 24 18:04:14 CST 2019
-
-#=================== labels for LAMS Administration =================#
-
-audit.organisation.change =Changed {0} for organisation: {1} from: {2} to: {3}
-audit.organisation.create =Created organisation: {0} of type: {1}
-audit.user.disable =Disabled account userId: {0}
-audit.user.delete =Deleted userId: {0}
-label.yes =Yes
-label.no =No
-label.or =Or
-title.job.list =Jobs
-lable.job.name =Job name
-lable.job.start.date =Job start date
-lable.job.description =Job description
-error.system =Oops! An unexpected exception thrown by the system. Contact your system administrator.
-error.org.invalid =Invalid organisation Id. {0}
-error.orgtype.invalid =Invalid operation for this type of organisation.
-error.name.required =Name is required.
-error.login.required =Login is required.
-error.login.unique =Login is already taken. {0}
-error.password.required =Password is required.
-error.authorisation =You are not authorised to do this.
-error.newpassword.mismatch =Your new password does not match.
-error.oldpassword.mismatch =Your old password is not correct.
-error.img.format =The file you uploaded looks not an image. An image file usually has .jpg, .gif, .png or .bmp extension.
-error.img.size =The file size exceeds the maximum 4096k limit.
-error.need.sysadmin =You need to have the sys admin role to do this.
-error.roles.empty =You need to assign at least one role.
-error.userid.invalid =Invalid User Id.
-error.firstname.required =First name is required.
-error.lastname.required =Last name is required.
-error.email.required =Email address is required.
-error.valid.email.required =Valid email address is required.
-error.required ={0} is required.
-error.not.unique ={0} is not unique.
-error.roles.invalid =One or more roles are invalid. {0}
-error.fail.add =Failed to add user.
-error.authmethod.invalid =Invalid authentication method. {0}
-error.locale.invalid =Invalid locale. {0}
-msg.user.add.to.parent.group =User/s marked with a '*' will be automatically added to the parent course with the same roles.
-msg.add.to.org =User will be added to {0}.
-msg.results.none =No results matched your query.
-msg.users.added ={0} users were added to course/subcourse.
-msg.disable.user.1 =This user has lesson and/or sequence data associated with it and cannot be deleted.
-msg.disable.user.2 =User account will be disabled instead, maintaining their data, but the account will be treated as deleted.
-msg.disable.user.3 =It will not appear in course/subcourse lists, nor will the user be able to login.
-msg.disable.user.4 =You can enable the user account again by editing the user's profile.
-msg.delete.user.1 =User has no associated data and can be safely removed.
-msg.delete.user.2 =Are you sure you want to delete this account?
-msg.edit.tool.content.1 =This page contains a list of installed tools.
-msg.edit.tool.content.2 =Changes to a tool's content using this screen will affect the tool's default appearance for all authors.
-msg.edit.tool.content.3 =Note that you cannot upload files to a tool's default content, only edit the default text.
-msg.roles.mandatory =You must assign at least one role.
-msg.roles.mandatory.users =You must assign at least one role for each user.
-organisation.state.ACTIVE =Active
-organisation.state.HIDDEN =Hidden
-organisation.state.ARCHIVED =Archived
-organisation.state.REMOVED =Removed
-admin.user.management =User management
-admin.user.entry =User entry
-admin.user.userid =User ID
-admin.user.login =Login
-admin.user.password =Password
-admin.user.password.confirm =Confirm password
-admin.user.name =Name
-admin.user.title =Title
-admin.user.first_name =First name
-admin.user.last_name =Last name
-admin.user.address_line_1 =Address line 1
-admin.user.address_line_2 =Address line 2
-admin.user.address_line_3 =Address line 3
-admin.user.city =City
-admin.user.state =State
-admin.user.postcode =Postcode
-admin.user.country =Country
-admin.user.day_phone =Work phone
-admin.user.evening_phone =Home phone
-admin.user.mobile_phone =Mobile phone
-admin.user.fax =Fax
-admin.user.email =Email
-admin.user.roles =Roles
-admin.user.manage =Manage users
-admin.user.delete =Delete
-admin.user.add =Add/Remove users
-admin.user.create =Create user
-admin.user.assign.roles =Assign roles
-admin.user.find =Find users
-admin.user.edit =Edit user details
-admin.user.disable =Disable user
-admin.user.actions =Actions
-admin.user.import =Import users
-admin.list.disabled.users =List disabled accounts
-label.excel.spreadsheet =File
-label.spreadsheet =spreadsheet
-label.download.template =Download the template
-role.AUTHOR =Author
-role.AUTHOR.ADMIN =Author Admin
-role.GROUP.MANAGER =Course Manager
-role.LEARNER =Learner
-role.MONITOR =Monitor
-role.SYSADMIN =System Admin
-label.member.of =Member of
-label.with.roles =With roles
-admin.organisation.management =Course/Subcourse management
-admin.organisation.entry =Course/Subcourse entry
-admin.organisation.name =Name
-admin.organisation.code =Code
-admin.organisation.description =Description
-admin.organisation.locale =Locale
-admin.organisation.status =Status
-admin.can.add.user =Course managers can add new users
-admin.can.browse.user =Course managers can browse all users in the system
-admin.can.change.status =Course managers can change status of course
-admin.organisation =Course/Subcourse
-admin.course =Course
-admin.class =Subcourse
-admin.course.manage =Manage courses
-admin.class.manage =Manage subcourses
-admin.class.add =Create subcourse
-admin.course.add =Create course
-admin.global.roles.manage =Manage global roles
-admin.number =No.
-admin.in =In
-admin.error =Oops!
-admin.save =Save
-admin.create =Create
-admin.edit =Edit
-admin.reset =Reset
-admin.delete =Delete
-admin.cancel =Cancel
-admin.search =Search
-admin.enable =Enable
-admin.disable =Disable
-sysadmin.maintain =Maintain LAMS
-sysadmin.maintain.loginpage =Maintain login page
-sysadmin.maintain.external.servers =Maintain integrated servers
-sysadmin.maintain.server.edit =Edit integrated server
-sysadmin.serverid =Id
-sysadmin.serverkey =Key
-sysadmin.servername =Name
-sysadmin.serverdesc =Description
-sysadmin.prefix =Prefix
-sysadmin.disabled =Disabled
-sysadmin.organisation =Organisation
-sysadmin.userinfoUrl =User information URL
-sysadmin.timeoutUrl =Timeout URL
-sysadmin.integrated.servers =integrated server(s) in total
-sysadmin.server.add =Add new server
-sysadmin.organisation.create =Create one
-sysadmin.organisation.select =Please select...
-sysadmin.login.text =Update login page text:
-sysadmin.headline =System Administration
-sysadmin.config.settings.edit =Edit configuration settings
-sysadmin.batch.temp.file.delete =Delete old temporary files
-sysadmin.job.list =Job list
-sysadmin.list.job =List scheduled jobs in Quartz queue
-sysadmin.edit.default.tool.content =Edit default tool content
-cache.maintain =Maintain LAMS cache
-cache.title =Cache management
-cache.entries.title =Cache nodes
-cache.explanation1 =Listed below are the current nodes in the cache. This keeps certain common objects in memory to speed up LAMS. It is managed automatically and should not require any intervention. However, if the system appears to be keeping "old values" e.g. an old first name, try clearing all the nodes in the cache. Once cleared, LAMS will reload the objects from the database.
-cache.explanation2 =Warning: Removing nodes will reduce the performance of the LAMS server. After a while, the cache will build up again and LAMS will run as usual.
-cache.explanation3 =Warning: If you remove a node, you will remove the node and all its child nodes.
-cache.button.remove =Remove
-admin.config.key =Key
-admin.config.value =Value
-label.show.all.users =Show all users
-msg.group.organisation_id =The organisation_id of this course is
-msg.subgroup.organisation_id =The organisation_id of this subcourse is
-msg.remove.from.subgroups =Removed users will also be removed from subcourse.
-label.global.roles =Global roles
-label.import =Import
-msg.import.intro =Use this screen to bulk import users using an Excel spreadsheet.
-msg.import.1 =In the spreadsheet, columns marked with a (*) are mandatory.
-msg.import.2 =Download the user template to create users.
-msg.import.conclusion =Click the help icon above for more information.
-label.results.per.page =Results per page
-msg.import.3 =Download the roles template to add users to course/subcourse and assign their roles.
-error.user.does.not.exist =User does not exist {0}
-msg.users.created ={0} users were created successfully.
-error.no.sysadmin.priviledge =You do not have the required privileges to perform this action.
-sysadmin.library.management =Learning library management
-sysadmin.library.totals =learning libraries in total
-sysadmin.library.activity.title =Title
-sysadmin.library.activity.description =Description
-sysadmin.library.createtim =Create time
-sysadmin.function =Function
-msg.cleanup.files.deleted ={0} files were deleted.
-msg.cleanup.warning =Warning: calculating the size of LAMS' temporary files may incur a performance hit on your server if it hasn't been cleaned out for a while.
-label.unknown =unknown
-msg.cleanup.actual.space =Depending on your server's file system, the actual space occupied may differ from the above.
-msg.cleanup.recommended =It's recommended to leave at least 1 day of temporary files in order not to remove anything that's currently in use.
-label.cleanup.delete =Delete temporary files older than this number of days
-label.can.join.joint.lessons =Can join joint lessons
-label.can.offer.joint.lessons =Can offer joint lessons
-error.cant.write.login.jsp =Couldn''t write value of {0} to {1}, please check your {2} configuration.
-label.login.as =Login as
-sysadmin.import.groups.title =Import courses
-heading.import.results =Import results
-table.heading.organisation.id =Organisation ID
-import.groups.intro =Use this screen to bulk import courses and subcourses using an Excel spreadsheet.
-import.groups.instructions =When creating a course, make sure the row above it is empty. When creating a subcourse, place it directly under it's parent course.
-import.groups.download =Download the courses template to create courses and subcourse.
-msg.please.wait =Please wait...
-sysadmin.ldap.configuration =LDAP configuration
-label.synchronise =Synchronise
-msg.num.ldap.users =There are {0} LDAP users in LAMS.
-msg.ldap.synchronise.intro =This feature allows you to synchronise LAMS' database with your LDAP server. This includes updating existing users' profile and adding them to the LAMS course which matches their attributes.
-msg.ldap.synchronise.warning =Note that this process may take some time depending on the number of users contained in your LDAP tree; it's best to perform this operation when the LAMS server will not be under load.
-heading.ldap.synchronise =Synchronise with LDAP
-msg.done =...done!
-msg.tool.management =Tool management
-sysadmin.tool.management =Tool management
-msg.ldap.synchronise.wait =Please wait while synchronisation completes...
-msg.ldap.synchronise.errors =The following errors were encountered:
-msg.num.search.results.users =LDAP server returned {0} users.
-msg.num.created.users ={0} user accounts were created in LAMS.
-msg.num.updated.users ={0} user accounts already existed in LAMS and were updated.
-msg.num.disabled.users ={0} user accounts were disabled in LAMS.
-config.header.system =System configuration
-config.header.email =Email
-config.header.uploads =Uploaded files
-config.header.chat =Chat server
-config.header.ldap =LDAP
-config.header.ldap.attributes =LDAP attribute mapping
-config.header.features =Features
-config.header.look.feel =Look and feel
-config.header.versions =Versions
-config.server.url =Server URL
-config.server.url.context.path =Server URL context path
-config.version =Version
-config.temp.dir =Temporary files directory
-config.ear.dir =EAR directory
-config.smtp.server =SMTP server
-config.lams.support.email =LAMS support email
-config.content.repository.path =Content repository directory
-config.upload.file.max.size =Maximum upload size
-config.upload.large.file.max.size =Maximum large upload size
-config.upload.file.max.memory.size =Maximum memory used when uploading
-config.executable.extensions =Executable extensions
-config.user.inactive.timeout =Inactive user timeout
-config.use.cache.debug.listener =Cache debug listener
-config.cleanup.preview.older.than.days =Number of days to keep preview
-config.authoring.client.version =Authoring client version
-config.monitor.client.version =Monitoring client version
-config.learner.client.version =Learner client version
-config.server.version.number =Server version number
-config.server.language =Locale
-config.server.page.direction =Locale page direction
-config.dictionary.date.created =Language pack install date
-config.help.url =Help URL
-config.xmpp.domain =Chat server domain
-config.xmpp.conference =Chat server conference
-config.xmpp.admin =Chat server admin username
-config.xmpp.password =Chat server admin password
-config.allow.direct.lesson.launch =Allow direct lesson launch
-config.allow.live.edit =Allow Live Edit
-config.ldap.provisioning.enabled =Enable provisioning
-config.ldap.provider.url =LDAP server URL
-config.ldap.security.authentication =Authentication mechanism
-config.ldap.principal.dn.prefix =User's distinguished name prefix
-config.ldap.principal.dn.suffix =User's distinguished name suffix
-config.ldap.security.protocol =Security protocol
-config.ldap.truststore.path =SSL certificate path
-config.ldap.truststore.password =SSL certificate password
-config.ldap.learner.map =Learner role map
-config.ldap.monitor.map =Monitor role map
-config.ldap.author.map =Author role map
-config.ldap.group.manager.map =Course Manager role map
-config.ldap.update.on.login =Update on login
-config.ldap.org.field =Course field map
-config.ldap.only.one.org =Only one course
-config.ldap.encrypt.password.from.browser =Encrypt password in browser
-config.ldap.search.results.page.size =Search results page size
-error.numeric ={0} only accepts numeric characters
-label.users.in.system ={0} users in system.
-label.users.in.group ={0} users in course.
-label.show =Show
-label.groups =courses
-label.subgroups =subcourses
-heading.manage.group.users =Manage Users of {0}
-label.learners =Learners
-label.monitors =Monitors
-label.authors =Authors
-label.group.managers =Course Managers
-label.sysadmins =Sysadmins
-label.author.admins =Author Administrators
-heading.users =Users
-label.number.of.users ={0} users.
-heading.potential.users =Potential users
-label.number.of.potential.users ={0} potential users.
-msg.click.remove.user =Click a user to remove them.
-msg.click.add.user =Click a user to add them.
-msg.show.all.potential.users =Show all potential users.
-label.next =Next
-audit.user.create =Created user {0}, named {1}
-audit.spreadsheet.error =Error processing spreadsheet row {0}: {1}
-audit.successful.user.import =Successfully imported {0} users.
-audit.successful.role.import =Successfully imported {0} role memberships.
-audit.successful.organisation.import =Successfully imported {0} organisations.
-config.forgot.password.allow.email =Allow forgot password email link in front page?
-config.forgot.password.email =Email address from which the forgotten password emails will be sent
-config.custom.tab.link =Custom tab URL
-config.custom.tab.title =Custom tab title
-config.authoring.screen.size =Authoring screen size
-config.monitor.screen.size =Monitor screen size
-config.learner.screen.size =Learner screen size
-config.admin.screen.size =System Admin screen size
-label.tool =Tool
-label.tool.version =Tool version
-label.database.version =Database version
-config.ldap.search.filter =Search filter
-config.ldap.base.dn =Base distinguished name
-config.ldap.bind.user.dn =Bind user distinguished name
-config.ldap.bind.user.password =Bind user password
-admin.user.authentication.method =Authentication method
-config.smtp.user =SMTP user
-config.smtp.password =SMTP password
-config.header.red5 =Media server
-config.red5.server.url =Media server URL
-config.red5.recordings.url =Media server recordings URL
-admin.gradebook.learner.enable =Enable Gradebook for learners
-sysadmin.serverUrl =External server URL
-admin.statistics.title =Server statistics
-admin.statistics.overall =Overall statistics
-admin.statistics.totalUsers =Total users:
-admin.statistics.groups =Total courses:
-admin.statistics.subGroups =Total subcourses:
-admin.statistics.learningDesigns =Total learning designs:
-admin.statistics.lessons =Total lessons:
-admin.statistics.activities =Total activities:
-admin.statistics.completedActivities =Total completed activities:
-admin.statistics.title.byGroup =Statistics by course
-admin.statistics.group.learners =Total Learners:
-admin.statistics.group.monitors =Total Monitors:
-admin.statistics.group.authors =Total Authors:
-admin.themes.title =Theme management
-admin.themes.theme =Theme
-admin.themes.description =Description
-admin.themes.imageDir =CSS image directory
-admin.themes.defaultTheme =Current default theme
-admin.themes.remove =Remove
-admin.themes.edit =Edit
-admin.themes.addNew =Add/Edit theme
-admin.themes.name =Name
-admin.themes.makeThemeDefault =Make this theme the server default
-admin.themes.makeDefault =Make default
-admin.themes.deleteConfirm =Are you sure you want to delete this theme?
-admin.themes.nameAlreadyExists =Please enter a new unused theme name, or click the edit icon to edit.
-config.use.internal.smtp.server =Use internal SMTP server
-label.email =Email
-title.clone.lessons =Clone lessons
-label.ok =OK
-title.clone.lessons.for =Clone lessons for {0}
-title.choose.group =Choose course to clone lessons from
-label.choose =Choose
-title.select.lessons =Select lessons
-title.select.staff =Select staff
-message.add.all.monitors =Add all monitors in this course to each lesson?
-label.configure.staff =Configure staff
-title.select.learners =Select learners
-message.add.all.learners =Add all learners in this course to each lesson?
-label.configure.learners =Configure learners
-label.clone =Clone
-message.cloned.lessons =Cloned {0} lessons.
-message.no.lessons =There are no lessons to clone.
-message.check.to.clone.lesson =Check the box for each lesson to clone it.
-message.no.lesson.description =No lesson description
-message.no.learners =This course has no learners! Please add some via the Add/Remove users screen.
-message.check.to.add.learner =Check the box of each learner to add to each of the new lessons.
-message.no.monitors =This course has no monitors! Please add some via the Add/Remove users screen.
-message.check.to.add.monitor =Check the box of each monitor to add as staff to each of the new lessons.
-label.return.to.group =Return to course
-admin.timezone.title =Timezone management
-admin.timezone.available.timezones =Available timezones
-admin.timezone.select.timezones.you.want.users.choose =Select the timezones you want the users for choose from. The server timezone is: {0}
-admin.timezone.select =Select
-admin.timezone.time.zone.id =Time zone ID
-admin.timezone.raw.offset =Raw offset (Hours : Minutes)
-admin.timezone.dst.offset =DST offset (Minutes)
-admin.timezone.display.name =Display name
-admin.user.enable.flash.for.learner.window =Enable Flash for learner window
-admin.user.time.zone =Time Zone
-config.show.all.my.lesson.link =Show "All my lessons" link in User's profile
-config.display.print.button =Display a print button when the lesson is completed
-sysadmin.lessonFinishUrl =Lesson finish callback URL
-admin.servertimezone.server.timezone.management =Server timezone management
-admin.servertimezone.title =Server timezone management
-admin.servertimezone.select.server.timezone =Please, select server timezone
-admin.servertimezone.raw.offset =Raw offset: {0}
-admin.servertimezone.dst.offset =DST offset: {0}
-admin.servertimezone.name =Name: {0}
-admin.servertimezone.select =Select
-config.profile.edit.enable =Enable profile editing
-config.profile.partial.edit.enable =Enable partial profile editing (only email and contact number can be changed)
-config.server2server.registration.enable =Enable remote server user registration
-admin.enable.course.notifications =Enable organisation notifications
-cache.entries.title2 =Cacheable entities
-cache.explanation4 =Listed below are cacheable classes and collections. This keeps certain common objects in memory to speed up LAMS. It is managed automatically and should not require any intervention. However, if the system appears to be keeping "old values" e.g. an old first name, try clearing all the nodes in the cache. Once cleared, LAMS will reload the objects from the database.
-cache.button.remove.all =Clear all cached objects
-cache.removed =Objects bound with entity name {0} were removed
-cache.removed.all =All cached objects were removed
-admin.add.edit.signup.page =Add/edit new signup page
-admin.signup.title =Signup pages
-admin.group =Course
-admin.lessons =Add to lessons?
-admin.staff =Add as staff/monitor?
-admin.course.key =Course Key
-admin.confirm.course.key =Confirm course key
-admin.description.txt =Description
-admin.disable.option =Disabled?
-admin.context.path =Path to sign up
-admin.submit =Submit
-admin.actions =Actions
-admin.group.code =Course access code
-admin.added.on =Added on
-admin.add.new.signup.page =Add a new signup page
-admin.list.signup.pages =List of signup pages
-error.course.keys.unequal =Course keys did not match
-error.context.exists =This URL context is taken
-config.authoring.suffix =Add unique suffix when importing Learning Designs
-config.authoring.single.activity =Enable single activity lessons
-error.name.invalid.characters =Name cannot contain any of these characters < > ^ * @ % $
-admin.login.tab =Display login tab as default
-error.firstname.invalid.characters =First name contains invalid characters
-error.lastname.invalid.characters =Last name contains invalid characters
-error.username.invalid.characters =Username can only contain alphanumeric characters and no spaces
-config.header.user.validation =User data validation
-config.user.validation.username =Enforce username validation (only alphanumeric, hyphen (-), underscore (_), period (.), at sign (@) and single quote (') allowed)
-config.user.validation.first.last.name =Enforce first and last name validation (only letters, hypen (-), space ( ) and single quote (') characters allowed)
-config.user.validation.emails =Enforce properly formatted emails
-config.cache.refresh =Configuration cache refresh interval (minutes)
-error.login.request.ttl.negative =Login request time to live should be a positive number.
-sysadmin.login.request.ttl =Time to live for integration requests (in minutes)
-sysadmin.login.request.ttl.enable =Enforce time limitation for integration requests
-tool.groups.open.button =Manage tool groups
-tool.groups.open.button.tooltip =Assign tools to groups for later use in Authoring
-tool.groups.dialog.title =Tool groups management
-tool.groups.dialog.instructions =Manage groups by dragging and dropping tools
-tool.groups.add.group.button =Add group
-tool.groups.remove.group.button.tooltip =Remove group
-tool.groups.group.default.name =Untitled
-tool.groups.remove.confirm =Are you sure you want to remove this group?
-tool.groups.group.name.error =A group name can not be blank
-tool.groups.save.error =Error while saving groups
-config.live.edit =Enable live edit
-sysadmin.extGroupsUrl =External groups URL
-server.config.title =Server configuration
-server.monitor.title =Server monitoring
-user.course.title =User and course configuration
-config.site.name =Site name
-label.create.lesson =Create lesson
-label.manage.tool.consumers =Maintain LTI Tool Consumers
-label.edit.tool.consumer =Edit tool consumer details
-label.add.tool.consumer =Add new tool consumer
-sysadmin.serversecret =Secret
-label.tool.consumers.count =LTI Tool Consumers(s) in total
-config.stacktrace.error =Show full error message (stack trace)
-config.password.minimum.characters =Minimum number of characters
-config.password.uppercase =Must contain uppercase letter(s)
-config.password.lowercase =Must contain lowercase letter(s)
-config.header.password.policy =Password policy
-config.password.numerics =Must contain at least a number
-config.password.symbols =Must contain at least one symbol(s)
-error.password.mismatch =Your passwords does not match.
-error.password.empty =Password cannot be empty.
-admin.user.change.password =Force password change
-label.password.max.length =must be less than 25 characters
-label.password.min.length =must be at least {0} characters long
-label.password.old.must.entered =Old password must be entered
-label.password.symbols.allowed =Only these symbols are allowed
-label.password.restrictions =Password must follow the restrictions shown
-label.password.must.contain =Password must contain
-label.password.must.ucase =at least 1 upper case letter
-label.password.must.number =at least 1 number
-label.password.must.symbol =at least 1 symbol
-sysadmin.batch.preview.lesson.delete =Delete old preview lessons
-msg.cleanup.preview.lesson.confirm =Are you sure you want to delete all preview lessons?
-msg.cleanup.preview.lesson.error =Error while deleting preview lessons
-label.cleanup.preview.lesson.count =Number of preview/all lessons:
-label.cleanup.preview.lesson.progress =Deleting...
-error.theme.invalid =Invalid theme
-label.theme =Theme
-config.default.theme =Default theme
-label.2FA.property.enable =Enable two-factor authentication
-sysadmin.lti.consumer.monitor.roles =Comma-separated list of monitor roles
-config.failed.attempts =Number of failed logins before locking account
-config.lock.out.time =Number of minutes to lock account for
-config.default.html.theme =Default theme
-admin.user.changePassword =Change password
-config.show.timezone.warning =Show warning when user's LAMS timezone does not match their computer/device.
-label.password.must.lcase =at least 1 lower case letter
-button.select.importfile =Select file to import
-label.upload.info =Uploaded file must be an Excel file and not exceed size of {0}
-errors.maxfilesize =Uploaded file exceeded maximum size: {0}
-error.attachment.not.xls =File is not an Excel .xls file.
-sysadmin.maintain.session =Logged in users
-sysadmin.maintain.session.login =Login
-sysadmin.maintain.session.id =Session ID
-error.portrait.removal.failed =Unable to delete portrait. See error file for details
-label.delete.portrait =Delete portrait
-sysadmin.maintain.session.delete =Delete
-config.display.portrait =Display learner's portrait in a progress bar
-config.allow.kumalive =Enable Kumalive
-admin.organisation.create.date =Creation date
-admin.org.password.change.title =Reset password for course members
-admin.org.password.change.button =Password reset
-admin.org.password.change.is.staff =Authors/monitors
-admin.org.password.change.is.learner =Students
-admin.org.password.change.generate =Generate new password
-admin.org.password.change.email =Email new password
-admin.org.password.change.force =Force change password after login
-admin.org.password.change.custom =Enter own password or generate one
-admin.org.password.change.grid.login =Login
-admin.org.password.change.grid.name =Name
-admin.org.password.change.grid.email =Email
-admin.org.password.change.grid.error.load =Error while loading users into grid
-admin.org.password.change.choose =Change password for
-admin.org.password.change.submit =Change password
-admin.org.password.change.error.prefix.staff =Authors/monitors password
-admin.org.password.change.error.prefix.learners =Authors/monitors password
-admin.org.password.change.success =Passwords successfully changed
-admin.org.password.change.email.subject =LAMS password change
-admin.org.password.change.email.body =Your password has been changed to: {0}\n\n-- email sent automatically by LAMS
-label.event.log =Event (Audit) Log
-label.event.topic =Topic
-label.event.type =Type of Event
-label.select.topic =Select topic...
-label.select.type =Select type...
-label.date =Date
-label.between.dates =Between dates
-label.lesson.with.name =Lesson: {0} ({1})
-label.activity.with.name =Activity: {0} ({1})
-label.type.teacher.learning.design.create =Learning Design Created
-label.type.teacher.lesson.create =Lesson Created
-label.type.teacher.lesson.start =Lesson Started
-label.type.teacher.lesson.change.state =Lesson State Changed
-label.type.learner.activity.start =Activity Started
-label.type.learner.activity.finish =Activity Finished
-label.type.learner.lesson.complete =Lesson Complete
-label.type.learner.lesson.mark.submit =Mark Submitted
-label.type.activity.edit =Activity Edited
-label.type.force.complete =Learner Force Completed
-label.type.user.org.admin =Organisation or User Changed
-label.type.login.as =Sysadmin Logged In As
-label.type.password.change =Password Change
-label.type.role.failure =Action Attempted With Wrong Roles
-label.type.account.locked =Account Locked
-label.type.notification =Notification
-label.type.mark.updated =Mark Updated
-label.type.mark.released =Mark Released
-label.type.learner.content.updated =Learner's Entry Modified
-label.type.learner.content.show.hide =Learner's Entry Shown/Hidden
-label.type.unknown =Unknown
-label.area.lesson =Lesson
-label.area.security =Security
-label.area.notification =Notification
-label.area.marks =Marks
-label.area.learner.content =Learner Entry
-label.area.unknown =Unknown
-audit.change.made.by =Changes Made By
-audit.change.made.to =Changes Made To
-admin.delete.lessons =Delete all lessons
-msg.delete.all.lesson.confirm.1 =You are about to PERMANENTLY delete ALL lessons from course "{0}". Are you ABSOLUTELY sure that you want to do this? There will be no turning back!
-msg.delete.all.lesson.confirm.2 =ALL lessons will be deleted, including active ones with learners in them. NO lessons will be left in the course. Are you sure you want to continue?
-msg.delete.all.lesson.error =Error while deleting course lessons lessons
-label.delete.all.lesson.count =Number of remaining / total lessons:
-label.delete.all.lesson.progress =Deleting...
-sysadmin.lesson.delete.title =Delete all lessons from course
-label.type.live.edit =Live Edit
-label.no.data.found =No data found
-msg.delete.organisation.confirm =You are about to permanently remove a course. Are you sure want to do this?
-msg.delete.organisation.delete.lessons.confirm =The course or one of its subcourses still contains lessons. They need to be permanently deleted first. You will be redirected to a page where you can do it.
-config.kumalive.enable =Enable Kumalive
-audit.remarks =Remarks
-config.allow.direct.access.for.integration.learners =Allow direct access to main LAMS page for integration learners.
-label.type.tool.mark.released =Tool Marks Released
-label.policy.minor.change.hint =Minor changes are meant to be wording changes that do not affect the meaning of the policy. If this option is not checked, then a new version of the policy will be created and users will be required to consent to this new policy version.
-label.select.country =Select a country
-error.country.required =Country is required.
-admin.policies.title =Policies and consents
-admin.add.edit.policy =Add/edit new policy
-label.name =Name
-label.policy.type =Policy type
-label.policy.status =Policy status
-label.version =Version
-label.last.modified =Last modified
-label.consents =Consents
-label.add.new.policy =Add a new policy
-label.policy.status.hint =An active policy will require consent from new users. Existing users will need to consent to this policy on their next log in.
-label.policy.status.active =Active
-label.policy.status.inactive =Inactive
-label.policy.type.site =Site policy
-label.policy.type.privacy =Privacy policy
-label.policy.type.third.party =Third party policy
-label.policy.type.other =Other policy
-label.summary =Summary
-label.full.policy =Full policy
-label.view.previous.versions =View previous versions
-label.activate =Activate
-label.deactivate =Deactivate
-label.minor.change =Minor change
-label.policy.consents =Policy consents
-label.consented =Consented?
-label.consented.on =Consented on
-label.user.consents =User consents
-label.user.full.name =Full name
-admin.user.create.date =Created on
-admin.email.verify =Require email verification?
-admin.email.verify.desc =(a verification email will be send before user can log in for the first time)
-config.smtp.port =SMTP port
-config.smtp.auth.security =SMTP authentication security
-config.server.country =Country
-sysadmin.lesson.gradebook.complete =Display activity scores on completion
-sysadmin.lesson.liveedit =Enable Live Edit
-sysadmin.lesson.notification =Enable lesson notifications
-sysadmin.lesson.presence =Allow learners to see who is online
-sysadmin.lesson.im =Enable Instant Messaging
-sysadmin.lesson.force.restart =Learners always start from the first activity
-sysadmin.lesson.allow.restart =Learners can restart the lesson
-sysadmin.lesson.default =Lesson default settings
-config.enable.portrait.editing =Enable profile portrait editing
-label.search =Search...
-config.enable.forgot.your.password.link =Enable "Forgot your password" link at the login page
-admin.outcome.title =Outcomes management
-outcome.authoring.title =Learning outcomes
-outcome.authoring.input =Search and select by outcome name or code
-outcome.authoring.existing =Added outcomes
-outcome.authoring.existing.none =none
-outcome.authoring.remove.confirm =Are you sure you want to remove this learning outcome?
-sysadmin.maintain.session.name =Name
-congfig.header.antivirus =Antivirus
-config.av.enable =Enable antivirus scanning on files upload
-config.av.host =ClamAV server host
-config.av.port =ClamAV server port
-label.type.login =User login
-label.type.logout =User logout
-label.type.config.change =Configuration change
-config.learning.outcome.add.enable =Enable quick add of learning outcomes in authoring
-
-#======= End labels: Exported 634 labels for en AU =====
+appName = admin
+#language code: en
+#locale code: AU
+
+ # Exported from the LAMS Community by Ernie Ghiglione on Wed Jan 16 14:38:11 CST 2019
+
+#=================== labels for LAMS Administration =================#
+
+audit.organisation.change =Changed {0} for organisation: {1} from: {2} to: {3}
+audit.organisation.create =Created organisation: {0} of type: {1}
+audit.user.disable =Disabled account userId: {0}
+audit.user.delete =Deleted userId: {0}
+label.yes =Yes
+label.no =No
+label.or =Or
+title.job.list =Jobs
+lable.job.name =Job name
+lable.job.start.date =Job start date
+lable.job.description =Job description
+error.system =Oops! An unexpected exception thrown by the system. Contact your system administrator.
+error.org.invalid =Invalid organisation Id. {0}
+error.orgtype.invalid =Invalid operation for this type of organisation.
+error.name.required =Name is required.
+error.login.required =Login is required.
+error.login.unique =Login is already taken. {0}
+error.password.required =Password is required.
+error.authorisation =You are not authorised to do this.
+error.newpassword.mismatch =Your new password does not match.
+error.oldpassword.mismatch =Your old password is not correct.
+error.img.format =The file you uploaded looks not an image. An image file usually has .jpg, .gif, .png or .bmp extension.
+error.img.size =The file size exceeds the maximum 4096k limit.
+error.need.sysadmin =You need to have the sys admin role to do this.
+error.roles.empty =You need to assign at least one role.
+error.userid.invalid =Invalid User Id.
+error.firstname.required =First name is required.
+error.lastname.required =Last name is required.
+error.email.required =Email address is required.
+error.valid.email.required =Valid email address is required.
+error.required ={0} is required.
+error.not.unique ={0} is not unique.
+error.roles.invalid =One or more roles are invalid. {0}
+error.fail.add =Failed to add user.
+error.authmethod.invalid =Invalid authentication method. {0}
+error.locale.invalid =Invalid locale. {0}
+msg.user.add.to.parent.group =User/s marked with a '*' will be automatically added to the parent course with the same roles.
+msg.add.to.org =User will be added to {0}.
+msg.results.none =No results matched your query.
+msg.users.added ={0} users were added to course/subcourse.
+msg.disable.user.1 =This user has lesson and/or sequence data associated with it and cannot be deleted.
+msg.disable.user.2 =User account will be disabled instead, maintaining their data, but the account will be treated as deleted.
+msg.disable.user.3 =It will not appear in course/subcourse lists, nor will the user be able to login.
+msg.disable.user.4 =You can enable the user account again by editing the user's profile.
+msg.delete.user.1 =User has no associated data and can be safely removed.
+msg.delete.user.2 =Are you sure you want to delete this account?
+msg.edit.tool.content.1 =This page contains a list of installed tools.
+msg.edit.tool.content.2 =Changes to a tool's content using this screen will affect the tool's default appearance for all authors.
+msg.edit.tool.content.3 =Note that you cannot upload files to a tool's default content, only edit the default text.
+msg.roles.mandatory =You must assign at least one role.
+msg.roles.mandatory.users =You must assign at least one role for each user.
+organisation.state.ACTIVE =Active
+organisation.state.HIDDEN =Hidden
+organisation.state.ARCHIVED =Archived
+organisation.state.REMOVED =Removed
+admin.user.management =User management
+admin.user.entry =User entry
+admin.user.userid =User ID
+admin.user.login =Login
+admin.user.password =Password
+admin.user.password.confirm =Confirm password
+admin.user.name =Name
+admin.user.title =Title
+admin.user.first_name =First name
+admin.user.last_name =Last name
+admin.user.address_line_1 =Address line 1
+admin.user.address_line_2 =Address line 2
+admin.user.address_line_3 =Address line 3
+admin.user.city =City
+admin.user.state =State
+admin.user.postcode =Postcode
+admin.user.country =Country
+admin.user.day_phone =Work phone
+admin.user.evening_phone =Home phone
+admin.user.mobile_phone =Mobile phone
+admin.user.fax =Fax
+admin.user.email =Email
+admin.user.roles =Roles
+admin.user.manage =Manage users
+admin.user.delete =Delete
+admin.user.add =Add/Remove users
+admin.user.create =Create user
+admin.user.assign.roles =Assign roles
+admin.user.find =Find users
+admin.user.edit =Edit user details
+admin.user.disable =Disable user
+admin.user.actions =Actions
+admin.user.import =Import users
+admin.list.disabled.users =List disabled accounts
+label.excel.spreadsheet =File
+label.spreadsheet =spreadsheet
+label.download.template =Download the template
+role.AUTHOR =Author
+role.AUTHOR.ADMIN =Author Admin
+role.GROUP.MANAGER =Course Manager
+role.LEARNER =Learner
+role.MONITOR =Monitor
+role.SYSADMIN =System Admin
+label.member.of =Member of
+label.with.roles =With roles
+admin.organisation.management =Course/Subcourse management
+admin.organisation.entry =Course/Subcourse entry
+admin.organisation.name =Name
+admin.organisation.code =Code
+admin.organisation.description =Description
+admin.organisation.locale =Locale
+admin.organisation.status =Status
+admin.can.add.user =Course managers can add new users
+admin.can.browse.user =Course managers can browse all users in the system
+admin.can.change.status =Course managers can change status of course
+admin.organisation =Course/Subcourse
+admin.course =Course
+admin.class =Subcourse
+admin.course.manage =Manage courses
+admin.class.manage =Manage subcourses
+admin.class.add =Create subcourse
+admin.course.add =Create course
+admin.global.roles.manage =Manage global roles
+admin.number =No.
+admin.in =In
+admin.error =Oops!
+admin.save =Save
+admin.create =Create
+admin.edit =Edit
+admin.reset =Reset
+admin.delete =Delete
+admin.cancel =Cancel
+admin.search =Search
+admin.enable =Enable
+admin.disable =Disable
+sysadmin.maintain =Maintain LAMS
+sysadmin.maintain.loginpage =Maintain login page
+sysadmin.maintain.external.servers =Maintain integrated servers
+sysadmin.maintain.server.edit =Edit integrated server
+sysadmin.serverid =Id
+sysadmin.serverkey =Key
+sysadmin.servername =Name
+sysadmin.serverdesc =Description
+sysadmin.prefix =Prefix
+sysadmin.disabled =Disabled
+sysadmin.organisation =Organisation
+sysadmin.userinfoUrl =User information URL
+sysadmin.timeoutUrl =Timeout URL
+sysadmin.integrated.servers =integrated server(s) in total
+sysadmin.server.add =Add new server
+sysadmin.organisation.create =Create one
+sysadmin.organisation.select =Please select...
+sysadmin.login.text =Update login page text:
+sysadmin.headline =System Administration
+sysadmin.config.settings.edit =Edit configuration settings
+sysadmin.batch.temp.file.delete =Delete old temporary files
+sysadmin.job.list =Job list
+sysadmin.list.job =List scheduled jobs in Quartz queue
+sysadmin.edit.default.tool.content =Edit default tool content
+cache.maintain =Maintain LAMS cache
+cache.title =Cache management
+cache.entries.title =Cache nodes
+cache.explanation1 =Listed below are the current nodes in the cache. This keeps certain common objects in memory to speed up LAMS. It is managed automatically and should not require any intervention. However, if the system appears to be keeping "old values" e.g. an old first name, try clearing all the nodes in the cache. Once cleared, LAMS will reload the objects from the database.
+cache.explanation2 =Warning: Removing nodes will reduce the performance of the LAMS server. After a while, the cache will build up again and LAMS will run as usual.
+cache.explanation3 =Warning: If you remove a node, you will remove the node and all its child nodes.
+cache.button.remove =Remove
+admin.config.key =Key
+admin.config.value =Value
+label.show.all.users =Show all users
+msg.group.organisation_id =The organisation_id of this course is
+msg.subgroup.organisation_id =The organisation_id of this subcourse is
+msg.remove.from.subgroups =Removed users will also be removed from subcourse.
+label.global.roles =Global roles
+label.import =Import
+msg.import.intro =Use this screen to bulk import users using an Excel spreadsheet.
+msg.import.1 =In the spreadsheet, columns marked with a (*) are mandatory.
+msg.import.2 =Download the user template to create users.
+msg.import.conclusion =Click the help icon above for more information.
+label.results.per.page =Results per page
+msg.import.3 =Download the roles template to add users to course/subcourse and assign their roles.
+error.user.does.not.exist =User does not exist {0}
+msg.users.created ={0} users were created successfully.
+error.no.sysadmin.priviledge =You do not have the required privileges to perform this action.
+sysadmin.library.management =Learning library management
+sysadmin.library.totals =learning libraries in total
+sysadmin.library.activity.title =Title
+sysadmin.library.activity.description =Description
+sysadmin.library.createtim =Create time
+sysadmin.function =Function
+msg.cleanup.files.deleted ={0} files were deleted.
+msg.cleanup.warning =Warning: calculating the size of LAMS' temporary files may incur a performance hit on your server if it hasn't been cleaned out for a while.
+label.unknown =unknown
+msg.cleanup.actual.space =Depending on your server's file system, the actual space occupied may differ from the above.
+msg.cleanup.recommended =It's recommended to leave at least 1 day of temporary files in order not to remove anything that's currently in use.
+label.cleanup.delete =Delete temporary files older than this number of days
+label.can.join.joint.lessons =Can join joint lessons
+label.can.offer.joint.lessons =Can offer joint lessons
+error.cant.write.login.jsp =Couldn''t write value of {0} to {1}, please check your {2} configuration.
+label.login.as =Login as
+sysadmin.import.groups.title =Import courses
+heading.import.results =Import results
+table.heading.organisation.id =Organisation ID
+import.groups.intro =Use this screen to bulk import courses and subcourses using an Excel spreadsheet.
+import.groups.instructions =When creating a course, make sure the row above it is empty. When creating a subcourse, place it directly under it's parent course.
+import.groups.download =Download the courses template to create courses and subcourse.
+msg.please.wait =Please wait...
+sysadmin.ldap.configuration =LDAP configuration
+label.synchronise =Synchronise
+msg.num.ldap.users =There are {0} LDAP users in LAMS.
+msg.ldap.synchronise.intro =This feature allows you to synchronise LAMS' database with your LDAP server. This includes updating existing users' profile and adding them to the LAMS course which matches their attributes.
+msg.ldap.synchronise.warning =Note that this process may take some time depending on the number of users contained in your LDAP tree; it's best to perform this operation when the LAMS server will not be under load.
+heading.ldap.synchronise =Synchronise with LDAP
+msg.done =...done!
+msg.tool.management =Tool management
+sysadmin.tool.management =Tool management
+msg.ldap.synchronise.wait =Please wait while synchronisation completes...
+msg.ldap.synchronise.errors =The following errors were encountered:
+msg.num.search.results.users =LDAP server returned {0} users.
+msg.num.created.users ={0} user accounts were created in LAMS.
+msg.num.updated.users ={0} user accounts already existed in LAMS and were updated.
+msg.num.disabled.users ={0} user accounts were disabled in LAMS.
+config.header.system =System configuration
+config.header.email =Email
+config.header.uploads =Uploaded files
+config.header.chat =Chat server
+config.header.ldap =LDAP
+config.header.ldap.attributes =LDAP attribute mapping
+config.header.features =Features
+config.header.look.feel =Look and feel
+config.header.versions =Versions
+config.header.antivirus =Antivirus
+config.header.qb =Question bank
+config.server.url =Server URL
+config.server.url.context.path =Server URL context path
+config.version =Version
+config.temp.dir =Temporary files directory
+config.ear.dir =EAR directory
+config.smtp.server =SMTP server
+config.lams.support.email =LAMS support email
+config.content.repository.path =Content repository directory
+config.upload.file.max.size =Maximum upload size
+config.upload.large.file.max.size =Maximum large upload size
+config.upload.file.max.memory.size =Maximum memory used when uploading
+config.executable.extensions =Executable extensions
+config.user.inactive.timeout =Inactive user timeout
+config.use.cache.debug.listener =Cache debug listener
+config.cleanup.preview.older.than.days =Number of days to keep preview
+config.authoring.client.version =Authoring client version
+config.monitor.client.version =Monitoring client version
+config.learner.client.version =Learner client version
+config.server.version.number =Server version number
+config.server.language =Locale
+config.server.page.direction =Locale page direction
+config.dictionary.date.created =Language pack install date
+config.help.url =Help URL
+config.xmpp.domain =Chat server domain
+config.xmpp.conference =Chat server conference
+config.xmpp.admin =Chat server admin username
+config.xmpp.password =Chat server admin password
+config.allow.direct.lesson.launch =Allow direct lesson launch
+config.allow.live.edit =Allow Live Edit
+config.ldap.provisioning.enabled =Enable provisioning
+config.ldap.provider.url =LDAP server URL
+config.ldap.security.authentication =Authentication mechanism
+config.ldap.principal.dn.prefix =User's distinguished name prefix
+config.ldap.principal.dn.suffix =User's distinguished name suffix
+config.ldap.security.protocol =Security protocol
+config.ldap.truststore.path =SSL certificate path
+config.ldap.truststore.password =SSL certificate password
+config.ldap.learner.map =Learner role map
+config.ldap.monitor.map =Monitor role map
+config.ldap.author.map =Author role map
+config.ldap.group.manager.map =Course Manager role map
+config.ldap.update.on.login =Update on login
+config.ldap.org.field =Course field map
+config.ldap.only.one.org =Only one course
+config.ldap.encrypt.password.from.browser =Encrypt password in browser
+config.ldap.search.results.page.size =Search results page size
+error.numeric ={0} only accepts numeric characters
+label.users.in.system ={0} users in system.
+label.users.in.group ={0} users in course.
+label.show =Show
+label.groups =courses
+label.subgroups =subcourses
+heading.manage.group.users =Manage Users of {0}
+label.learners =Learners
+label.monitors =Monitors
+label.authors =Authors
+label.group.managers =Course Managers
+label.sysadmins =Sysadmins
+label.author.admins =Author Administrators
+heading.users =Users
+label.number.of.users ={0} users.
+heading.potential.users =Potential users
+label.number.of.potential.users ={0} potential users.
+msg.click.remove.user =Click a user to remove them.
+msg.click.add.user =Click a user to add them.
+msg.show.all.potential.users =Show all potential users.
+label.next =Next
+audit.user.create =Created user {0}, named {1}
+audit.spreadsheet.error =Error processing spreadsheet row {0}: {1}
+audit.successful.user.import =Successfully imported {0} users.
+audit.successful.role.import =Successfully imported {0} role memberships.
+audit.successful.organisation.import =Successfully imported {0} organisations.
+config.forgot.password.allow.email =Allow forgot password email link in front page?
+config.forgot.password.email =Email address from which the forgotten password emails will be sent
+config.custom.tab.link =Custom tab URL
+config.custom.tab.title =Custom tab title
+config.authoring.screen.size =Authoring screen size
+config.monitor.screen.size =Monitor screen size
+config.learner.screen.size =Learner screen size
+config.admin.screen.size =System Admin screen size
+label.tool =Tool
+label.tool.version =Tool version
+label.database.version =Database version
+config.ldap.search.filter =Search filter
+config.ldap.base.dn =Base distinguished name
+config.ldap.bind.user.dn =Bind user distinguished name
+config.ldap.bind.user.password =Bind user password
+admin.user.authentication.method =Authentication method
+config.smtp.user =SMTP user
+config.smtp.password =SMTP password
+config.header.red5 =Media server
+config.red5.server.url =Media server URL
+config.red5.recordings.url =Media server recordings URL
+admin.gradebook.learner.enable =Enable Gradebook for learners
+sysadmin.serverUrl =External server URL
+admin.statistics.title =Server statistics
+admin.statistics.overall =Overall statistics
+admin.statistics.totalUsers =Total users:
+admin.statistics.groups =Total courses:
+admin.statistics.subGroups =Total subcourses:
+admin.statistics.learningDesigns =Total learning designs:
+admin.statistics.lessons =Total lessons:
+admin.statistics.activities =Total activities:
+admin.statistics.completedActivities =Total completed activities:
+admin.statistics.title.byGroup =Statistics by course
+admin.statistics.group.learners =Total Learners:
+admin.statistics.group.monitors =Total Monitors:
+admin.statistics.group.authors =Total Authors:
+admin.themes.title =Theme management
+admin.themes.theme =Theme
+admin.themes.description =Description
+admin.themes.imageDir =CSS image directory
+admin.themes.defaultTheme =Current default theme
+admin.themes.remove =Remove
+admin.themes.edit =Edit
+admin.themes.addNew =Add/Edit theme
+admin.themes.name =Name
+admin.themes.makeThemeDefault =Make this theme the server default
+admin.themes.makeDefault =Make default
+admin.themes.deleteConfirm =Are you sure you want to delete this theme?
+admin.themes.nameAlreadyExists =Please enter a new unused theme name, or click the edit icon to edit.
+config.use.internal.smtp.server =Use internal SMTP server
+label.email =Email
+title.clone.lessons =Clone lessons
+label.ok =OK
+title.clone.lessons.for =Clone lessons for {0}
+title.choose.group =Choose course to clone lessons from
+label.choose =Choose
+title.select.lessons =Select lessons
+title.select.staff =Select staff
+message.add.all.monitors =Add all monitors in this course to each lesson?
+label.configure.staff =Configure staff
+title.select.learners =Select learners
+message.add.all.learners =Add all learners in this course to each lesson?
+label.configure.learners =Configure learners
+label.clone =Clone
+message.cloned.lessons =Cloned {0} lessons.
+message.no.lessons =There are no lessons to clone.
+message.check.to.clone.lesson =Check the box for each lesson to clone it.
+message.no.lesson.description =No lesson description
+message.no.learners =This course has no learners! Please add some via the Add/Remove users screen.
+message.check.to.add.learner =Check the box of each learner to add to each of the new lessons.
+message.no.monitors =This course has no monitors! Please add some via the Add/Remove users screen.
+message.check.to.add.monitor =Check the box of each monitor to add as staff to each of the new lessons.
+label.return.to.group =Return to course
+admin.timezone.title =Timezone management
+admin.timezone.available.timezones =Available timezones
+admin.timezone.select.timezones.you.want.users.choose =Select the timezones you want the users for choose from. The server timezone is: {0}
+admin.timezone.select =Select
+admin.timezone.time.zone.id =Time zone ID
+admin.timezone.raw.offset =Raw offset (Hours : Minutes)
+admin.timezone.dst.offset =DST offset (Minutes)
+admin.timezone.display.name =Display name
+admin.user.enable.flash.for.learner.window =Enable Flash for learner window
+admin.user.time.zone =Time Zone
+config.show.all.my.lesson.link =Show "All my lessons" link in User's profile
+config.display.print.button =Display a print button when the lesson is completed
+sysadmin.lessonFinishUrl =Lesson finish callback URL
+admin.servertimezone.server.timezone.management =Server timezone management
+admin.servertimezone.title =Server timezone management
+admin.servertimezone.select.server.timezone =Please, select server timezone
+admin.servertimezone.raw.offset =Raw offset: {0}
+admin.servertimezone.dst.offset =DST offset: {0}
+admin.servertimezone.name =Name: {0}
+admin.servertimezone.select =Select
+config.profile.edit.enable =Enable profile editing
+config.profile.partial.edit.enable =Enable partial profile editing (only email and contact number can be changed)
+config.server2server.registration.enable =Enable remote server user registration
+admin.enable.course.notifications =Enable organisation notifications
+cache.entries.title2 =Cacheable entities
+cache.explanation4 =Listed below are cacheable classes and collections. This keeps certain common objects in memory to speed up LAMS. It is managed automatically and should not require any intervention. However, if the system appears to be keeping "old values" e.g. an old first name, try clearing all the nodes in the cache. Once cleared, LAMS will reload the objects from the database.
+cache.button.remove.all =Clear all cached objects
+cache.removed =Objects bound with entity name {0} were removed
+cache.removed.all =All cached objects were removed
+admin.add.edit.signup.page =Add/edit new signup page
+admin.signup.title =Signup pages
+admin.group =Course
+admin.lessons =Add to lessons?
+admin.staff =Add as staff/monitor?
+admin.course.key =Course Key
+admin.confirm.course.key =Confirm course key
+admin.description.txt =Description
+admin.disable.option =Disabled?
+admin.context.path =Path to sign up
+admin.submit =Submit
+admin.actions =Actions
+admin.group.code =Course access code
+admin.added.on =Added on
+admin.add.new.signup.page =Add a new signup page
+admin.list.signup.pages =List of signup pages
+error.course.keys.unequal =Course keys did not match
+error.context.exists =This URL context is taken
+config.authoring.suffix =Add unique suffix when importing Learning Designs
+config.authoring.single.activity =Enable single activity lessons
+error.name.invalid.characters =Name cannot contain any of these characters < > ^ * @ % $
+admin.login.tab =Display login tab as default
+error.firstname.invalid.characters =First name contains invalid characters
+error.lastname.invalid.characters =Last name contains invalid characters
+error.username.invalid.characters =Username can only contain alphanumeric characters and no spaces
+config.header.user.validation =User data validation
+config.user.validation.username =Enforce username validation (only alphanumeric, hyphen (-), underscore (_), period (.), at sign (@) and single quote (') allowed)
+config.user.validation.first.last.name =Enforce first and last name validation (only letters, hypen (-), space ( ) and single quote (') characters allowed)
+config.user.validation.emails =Enforce properly formatted emails
+config.cache.refresh =Configuration cache refresh interval (minutes)
+error.login.request.ttl.negative =Login request time to live should be a positive number.
+sysadmin.login.request.ttl =Time to live for integration requests (in minutes)
+sysadmin.login.request.ttl.enable =Enforce time limitation for integration requests
+tool.groups.open.button =Manage tool groups
+tool.groups.open.button.tooltip =Assign tools to groups for later use in Authoring
+tool.groups.dialog.title =Tool groups management
+tool.groups.dialog.instructions =Manage groups by dragging and dropping tools
+tool.groups.add.group.button =Add group
+tool.groups.remove.group.button.tooltip =Remove group
+tool.groups.group.default.name =Untitled
+tool.groups.remove.confirm =Are you sure you want to remove this group?
+tool.groups.group.name.error =A group name can not be blank
+tool.groups.save.error =Error while saving groups
+config.live.edit =Enable live edit
+sysadmin.extGroupsUrl =External groups URL
+server.config.title =Server configuration
+server.monitor.title =Server monitoring
+user.course.title =User and course configuration
+config.site.name =Site name
+label.create.lesson =Create lesson
+label.manage.tool.consumers =Maintain LTI Tool Consumers
+label.edit.tool.consumer =Edit tool consumer details
+label.add.tool.consumer =Add new tool consumer
+sysadmin.serversecret =Secret
+label.tool.consumers.count =LTI Tool Consumers(s) in total
+config.stacktrace.error =Show full error message (stack trace)
+config.password.minimum.characters =Minimum number of characters
+config.password.uppercase =Must contain uppercase letter(s)
+config.password.lowercase =Must contain lowercase letter(s)
+config.header.password.policy =Password policy
+config.password.numerics =Must contain at least a number
+config.password.symbols =Must contain at least one symbol(s)
+error.password.mismatch =Your passwords does not match.
+error.password.empty =Password cannot be empty.
+admin.user.change.password =Force password change
+label.password.max.length =must be less than 25 characters
+label.password.min.length =must be at least {0} characters long
+label.password.old.must.entered =Old password must be entered
+label.password.symbols.allowed =Only these symbols are allowed
+label.password.restrictions =Password must follow the restrictions shown
+label.password.must.contain =Password must contain
+label.password.must.ucase =at least 1 upper case letter
+label.password.must.number =at least 1 number
+label.password.must.symbol =at least 1 symbol
+sysadmin.batch.preview.lesson.delete =Delete old preview lessons
+msg.cleanup.preview.lesson.confirm =Are you sure you want to delete all preview lessons?
+msg.cleanup.preview.lesson.error =Error while deleting preview lessons
+label.cleanup.preview.lesson.count =Number of preview/all lessons:
+label.cleanup.preview.lesson.progress =Deleting...
+error.theme.invalid =Invalid theme
+label.theme =Theme
+config.default.theme =Default theme
+label.2FA.property.enable =Enable two-factor authentication
+sysadmin.lti.consumer.monitor.roles =Comma-separated list of monitor roles
+config.failed.attempts =Number of failed logins before locking account
+config.lock.out.time =Number of minutes to lock account for
+config.default.html.theme =Default theme
+admin.user.changePassword =Change password
+config.show.timezone.warning =Show warning when user's LAMS timezone does not match their computer/device.
+label.password.must.lcase =at least 1 lower case letter
+button.select.importfile =Select file to import
+label.upload.info =Uploaded file must be an Excel file and not exceed size of {0}
+errors.maxfilesize =Uploaded file exceeded maximum size: {0}
+error.attachment.not.xls =File is not an Excel .xls file.
+sysadmin.maintain.session =Logged in users
+sysadmin.maintain.session.login =Login
+sysadmin.maintain.session.id =Session ID
+error.portrait.removal.failed =Unable to delete portrait. See error file for details
+label.delete.portrait =Delete portrait
+sysadmin.maintain.session.delete =Delete
+config.display.portrait =Display learner's portrait in a progress bar
+config.allow.kumalive =Enable Kumalive
+admin.organisation.create.date =Creation date
+admin.org.password.change.title =Reset password for course members
+admin.org.password.change.button =Password reset
+admin.org.password.change.is.staff =Authors/monitors
+admin.org.password.change.is.learner =Students
+admin.org.password.change.generate =Generate new password
+admin.org.password.change.email =Email new password
+admin.org.password.change.force =Force change password after login
+admin.org.password.change.custom =Enter own password or generate one
+admin.org.password.change.grid.login =Login
+admin.org.password.change.grid.name =Name
+admin.org.password.change.grid.email =Email
+admin.org.password.change.grid.error.load =Error while loading users into grid
+admin.org.password.change.choose =Change password for
+admin.org.password.change.submit =Change password
+admin.org.password.change.error.prefix.staff =Authors/monitors password
+admin.org.password.change.error.prefix.learners =Authors/monitors password
+admin.org.password.change.success =Passwords successfully changed
+admin.org.password.change.email.subject =LAMS password change
+admin.org.password.change.email.body =Your password has been changed to: {0}\n\n-- email sent automatically by LAMS
+label.event.log =Event (Audit) Log
+label.event.topic =Topic
+label.event.type =Type of Event
+label.select.topic =Select topic...
+label.select.type =Select type...
+label.date =Date
+label.between.dates =Between dates
+label.lesson.with.name =Lesson: {0} ({1})
+label.activity.with.name =Activity: {0} ({1})
+label.type.teacher.learning.design.create =Learning Design Created
+label.type.teacher.lesson.create =Lesson Created
+label.type.teacher.lesson.start =Lesson Started
+label.type.teacher.lesson.change.state =Lesson State Changed
+label.type.learner.activity.start =Activity Started
+label.type.learner.activity.finish =Activity Finished
+label.type.learner.lesson.complete =Lesson Complete
+label.type.learner.lesson.mark.submit =Mark Submitted
+label.type.activity.edit =Activity Edited
+label.type.force.complete =Learner Force Completed
+label.type.user.org.admin =Organisation or User Changed
+label.type.login.as =Sysadmin Logged In As
+label.type.password.change =Password Change
+label.type.role.failure =Action Attempted With Wrong Roles
+label.type.account.locked =Account Locked
+label.type.notification =Notification
+label.type.mark.updated =Mark Updated
+label.type.mark.released =Mark Released
+label.type.learner.content.updated =Learner's Entry Modified
+label.type.learner.content.show.hide =Learner's Entry Shown/Hidden
+label.type.unknown =Unknown
+label.area.lesson =Lesson
+label.area.security =Security
+label.area.notification =Notification
+label.area.marks =Marks
+label.area.learner.content =Learner Entry
+label.area.unknown =Unknown
+audit.change.made.by =Changes Made By
+audit.change.made.to =Changes Made To
+admin.delete.lessons =Delete all lessons
+msg.delete.all.lesson.confirm.1 =You are about to PERMANENTLY delete ALL lessons from course "{0}". Are you ABSOLUTELY sure that you want to do this? There will be no turning back!
+msg.delete.all.lesson.confirm.2 =ALL lessons will be deleted, including active ones with learners in them. NO lessons will be left in the course. Are you sure you want to continue?
+msg.delete.all.lesson.error =Error while deleting course lessons lessons
+label.delete.all.lesson.count =Number of remaining / total lessons:
+label.delete.all.lesson.progress =Deleting...
+sysadmin.lesson.delete.title =Delete all lessons from course
+label.type.live.edit =Live Edit
+label.no.data.found =No data found
+msg.delete.organisation.confirm =You are about to permanently remove a course. Are you sure want to do this?
+msg.delete.organisation.delete.lessons.confirm =The course or one of its subcourses still contains lessons. They need to be permanently deleted first. You will be redirected to a page where you can do it.
+config.kumalive.enable =Enable Kumalive
+audit.remarks =Remarks
+config.allow.direct.access.for.integration.learners =Allow direct access to main LAMS page for integration learners.
+label.type.tool.mark.released =Tool Marks Released
+label.policy.minor.change.hint =Minor changes are meant to be wording changes that do not affect the meaning of the policy. If this option is not checked, then a new version of the policy will be created and users will be required to consent to this new policy version.
+label.select.country =Select a country
+error.country.required =Country is required.
+admin.policies.title =Policies and consents
+admin.add.edit.policy =Add/edit new policy
+label.name =Name
+label.policy.type =Policy type
+label.policy.status =Policy status
+label.version =Version
+label.last.modified =Last modified
+label.consents =Consents
+label.add.new.policy =Add a new policy
+label.policy.status.hint =An active policy will require consent from new users. Existing users will need to consent to this policy on their next log in.
+label.policy.status.active =Active
+label.policy.status.inactive =Inactive
+label.policy.type.site =Site policy
+label.policy.type.privacy =Privacy policy
+label.policy.type.third.party =Third party policy
+label.policy.type.other =Other policy
+label.summary =Summary
+label.full.policy =Full policy
+label.view.previous.versions =View previous versions
+label.activate =Activate
+label.deactivate =Deactivate
+label.minor.change =Minor change
+label.policy.consents =Policy consents
+label.consented =Consented?
+label.consented.on =Consented on
+label.user.consents =User consents
+label.user.full.name =Full name
+admin.user.create.date =Created on
+admin.email.verify =Require email verification?
+admin.email.verify.desc =(a verification email will be send before user can log in for the first time)
+config.smtp.port =SMTP port
+config.smtp.auth.security =SMTP authentication security
+config.server.country =Country
+sysadmin.lesson.gradebook.complete =Display activity scores on completion
+sysadmin.lesson.liveedit =Enable Live Edit
+sysadmin.lesson.notification =Enable lesson notifications
+sysadmin.lesson.presence =Allow learners to see who is online
+sysadmin.lesson.im =Enable Instant Messaging
+sysadmin.lesson.force.restart =Learners always start from the first activity
+sysadmin.lesson.allow.restart =Learners can restart the lesson
+sysadmin.lesson.default =Lesson default settings
+config.enable.portrait.editing =Enable profile portrait editing
+label.search =Search...
+config.enable.forgot.your.password.link =Enable "Forgot your password" link at the login page
+admin.outcome.title =Outcomes management
+outcome.authoring.title =Learning outcomes
+outcome.authoring.input =Search and select by outcome name or code
+outcome.authoring.existing =Added outcomes
+outcome.authoring.existing.none =none
+outcome.authoring.remove.confirm =Are you sure you want to remove this learning outcome?
+sysadmin.maintain.session.name =Name
+congfig.header.antivirus =Antivirus
+config.av.enable =Enable antivirus scanning on file upload
+config.av.host =ClamAV server host
+config.av.port =ClamAV server port
+label.type.login =User login
+label.type.logout =User logout
+label.type.config.change =Configuration change
+config.learning.outcome.add.enable =Enable quick add of learning outcomes in authoring
+config.qb.qti.enable =Enable QTI question import/export
+config.qb.word.enable =Enable Word question import
+config.qb.collections.create.enable =Allow creating custom collections
+config.qb.collections.transfer.enable =Allow question transfer between collections
+config.qb.monitors.read.only =Force read-only access for monitors
+config.qb.stats.min.participants =Minimum test participant number to calculate question indexes
+config.qb.stats.group.size =Percent of participants in top/bottom performers group (default: 27)
+
+#======= End labels: Exported 627 labels for en AU =====
Index: lams_central/conf/language/lams/ApplicationResources.properties
===================================================================
diff -u -r2128de996e2dddada19946afdcd719bbd7bdbfab -r394f403c289f0fd7808c228840bead5c4e7d5d32
--- lams_central/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 2128de996e2dddada19946afdcd719bbd7bdbfab)
+++ lams_central/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 394f403c289f0fd7808c228840bead5c4e7d5d32)
@@ -70,7 +70,6 @@
title.error.window =LAMS :: Error
authoring.msg.save.success =Congratulations, your content saved successfully!
label.authoring.close =Close
-label.authoring.re.edit =Re-edit
index.welcome =Welcome
index.logout =Logout
index.refresh =Refresh
@@ -404,6 +403,7 @@
authoring.fla.course.groups.to.branches.match.dialog.title =Match Course Groups to Branching Groups
authoring.fla.branch.mapping.course.groups.header =Course groups
authoring.fla.branch.mapping.branching.groups.header =Branching groups
+authoring.fla.branch.mapping.ordered.asc =Start with branches mapped to highest ordered answers
label.tab.advanced.field.force.restart =Learners always start from the first activity
label.tab.advanced.field.allow.restart =Learners can restart the lesson
label.verification.code =Verification code
@@ -793,7 +793,6 @@
label.view =View
index.outcome.manage =Outcomes
index.outcome.manage.tooltip =Manage learning outcomes and scales
-outcome.manage.title =Course outcomes
outcome.manage.remove =Remove outcome
outcome.manage.remove.confirm =Are you sure you want to remove this outcome?
outcome.manage.add =Add outcome
@@ -802,24 +801,21 @@
outcome.manage.add.name =Name
outcome.manage.add.code =Code
outcome.manage.add.description =Description
-outcome.manage.add.global =Global
outcome.manage.add.scale =Scale
outcome.manage.add.save =Save
-outcome.manage.scope =Scope
-outcome.manage.scope.global =global
-outcome.manage.scope.course =course
outcome.manage.add.error =Error while saving an outcome
outcome.manage.add.error.name.blank =Name can not be blank
outcome.manage.add.error.code.blank =Code can not be blank
outcome.manage.add.error.scale.choose =You have to choose a scale
+outcome.manage.remove.error.in.use =The outcome is mapped to some items. It can not be removed.
scale.title =Scales
scale.manage =Manage scales
scale.manage.add =Add scale
scale.manage.edit =Edit scale
scale.manage.view =View scale
-scale.manage.title =Course scales
scale.manage.remove =Remove scale
-scale.manage.remove.scale =Error while removing a scale. It is probably used in some outcomes.
+scale.manage.remove.scale =Error while removing a scale.
+scale.manage.remove.error.in.use =The scale is used in some outcomes. It can not be removed.
scale.manage.remove.confirm =Are you sure you want to remove this scale?
scale.manage.add.value =Values
scale.manage.add.value.info =Enter comma separated values in increasing order of value. For example, an A,B,C,D scale must be entered as D,C,B,A.
@@ -829,6 +825,7 @@
outcome.authoring.input =Search and select by outcome name or code
outcome.authoring.existing =Added outcomes
outcome.authoring.existing.none =none
+outcome.authoring.remove.confirm =Are you sure you want to remove this learning outcome?
outcome.export.date =Exported on:
outcome.export =Export
outcome.import =Import
@@ -839,47 +836,78 @@
authoring.template.list.introduction =Select a template from the list to see more details about the design that will be created. You can the proceed to create the design or return back to this list.
authoring.learning.design.templates =Learning Design Templates
authoring.template.successful =Your design has been saved as {0}.
-authoring.label.sequence.title =Title of Sequence
-authoring.error.question.num =Question {0} may not be blank
-authoring.error.question.correct.num =One of the answers for Question {0} needs to be correct.
+authoring.label.sequence.title =Name
+authoring.error.question.num =RAT Questions: Question {0} may not be blank
+authoring.error.question.correct.num =RAT Questions: One of the answers for Question {0} needs to be correct.
authoring.description.application.exercise =Application Exercise (These question(s) will be shown during the analysis phase in the sequence.)
-authoring.label.grouping =Grouping
+authoring.label.grouping =Teams
+authoring.label.group.name =Team_{0}
authoring.label.grouping.learners.choice =Learner's Choice
authoring.label.grouping.teachers.choice =Teacher's Choice
authoring.label.grouping.random.allocation =Random Allocation
-authoring.label.numgroups =Number of groups:
-authoring.error.numgroups =Number of groups must be 1 to 99.
+authoring.label.numgroups =Number of teams:
+authoring.error.numgroups =Number of teams must be 1 to 99.
authoring.label.numlearners =Number of learners:
authoring.error.numlearners =Number of learners must be 1 to 99.
-authoring.error.group.data =Group settings are not correct.
+authoring.error.group.data =Teams settings are not correct.
authoring.section.lessondetails =Lesson Details
-authoring.section.questions =Questions
-authoring.section.applicationexercise =Application Exercise
+authoring.section.questions =RAT Questions
+authoring.section.applicationexercise =Application Exercises
authoring.section.introduction =Introduction
-authoring.create.question =Create Question
-authoring.create.essay.question =Create Essay Question
-authoring.create.mc.question =Create Multiple Choice Question
+authoring.create.question =Add Question
+authoring.create.essay.question =Add Essay Question
+authoring.create.mc.question =Add Multiple Choice Question
authoring.label.application.exercise.num =Application Exercise {0}
-authoring.error.application.exercise.num =Application Exercise {0} may not be blank.
+authoring.error.application.exercise.num =Application Exercises: Application Exercise {0} may not be blank.
authoring.label.question.num =Question {0}
authoring.label.option.num =Option {0}
authoring.error.option =Option may not be blank
authoring.label.correct.question =Correct?
-authoring.create.option =Create Option
+authoring.create.option =Add Option
button.next =Next
button.previous =Previous
-button.return.to.template.list =Go back to Template list
+button.return.to.template.list =Back to Templates
authoring.error.content.id =Content ID is missing
-authoring.error.question.must.have.answer.num =Question {0} must have at least one answer.
-authoring.error.application.exercise.must.have.answer.num =Application Exercise {0} must have at least one answer.
-authoring.error.application.exercise.must.have.100.percent =Application Exercise {0} must have at least one answer worth 100%.
-authoring.error.application.exercise.not.blank.and.grade =Application Exercise {0} may not be blank and must have a grade.
+authoring.error.question.must.have.answer.num =RAT Questions: Question {0} must have at least one answer.
+authoring.error.application.exercise.question.must.not.be.blank.num =Application Exercises: {0} Question {1} may not be blank.
+authoring.error.application.exercise.must.have.answer.num =Application Exercises: {0} Question {1} must have at least one answer.
+authoring.error.application.exercise.must.have.100.percent =Application Exercises: {0} Question {1} must have at least one answer worth 100%.
+authoring.error.application.exercise.not.blank.and.grade =Application Exercises: {0} Question {1} may not be blank and must have a grade.
+authoring.error.application.exercise.needs.noticeboard.text =Application Exercises: {0} is missing the text for the noticeboard.
+authoring.error.rat.not.blank=RAT Questions: There must be at least one question.
authoring.label.grade =Grade
authoring.label.none =None
authoring.tbl.template.title =Team Based Learning
authoring.tbl.template.description =Individual and Team Readiness Assessments followed by Application Exercises.
-authoring.tbl.desc.question =These questions are for iRA and tRA. Click "Create Question" to add more questions. Turn on "Enable confidence levels" to have the learners' confidence levels from the iRA shown on the tRA screen.
-authoring.tbl.desc.ae =State the questions for AE. Click "Create Question" to add more questions.
+authoring.tbl.desc.question =Adding RAT questions.
+authoring.tbl.enable.confidence.tooltip =Asks students in the iRAT how confident they are with their choosen answer. Then the confidence level for each student is displayed in the tRAT to all members of their team.
+authoring.tbl.desc.ae =Adding Application Exercises (AEs). You can create multiple AEs if needed.
+authoring.template.basic.import.qti =Import IMS QTI
+authoring.tbl.use.noticeboard=Add Noticeboard after AE
+authoring.tbl.use.noticeboard.tooltip=After the AE, displays content to students as additional information or as a reflection on the AE topic
+authoring.create.application.exercise=Add New Application Exercise
+label.marks=Marks
+authoring.tbl.delete.appex.prompt=Do you want to delete the Application Exercise {0}?
+authoring.tbl.delete.mcq.prompt=Do you want to delete the RAT Question {0}?
+#QB questions#
+label.create.question =Create question
+label.question.type.multiple.choice =Multiple choice
+label.question.type.matching.pairs =Matching pairs
+label.question.type.short.answer =Short answer
+label.question.type.numerical =Numerical
+label.question.type.true.false =True/False
+label.question.type.essay =Essay
+label.question.type.ordering =Ordering
+label.question.type.mark.hedging =Mark hedging
+label.search.question.bank =Search question bank
+label.question.type =Type:
+label.question.successfully.imported =Question successfully imported
+label.import.qti =Import questions in IMS QTI format
+label.export.qti =Export questions in IMS QTI format
+label.import.xml =Import questions in XML format
+label.export.xml =Export questions in XML format
+msg.import.file.format =The import file must be .xml file exported from assessment tool and not exceed size of {0}
+error.import.file.format =The import file is not an .xml file.
#======= End labels: Exported 872 labels for en AU =====
Index: lams_central/conf/language/lams/ApplicationResources_en_AU.properties
===================================================================
diff -u -r1b530a88ae6d3a1e553081b3d56117ec5ad3622a -r394f403c289f0fd7808c228840bead5c4e7d5d32
--- lams_central/conf/language/lams/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision 1b530a88ae6d3a1e553081b3d56117ec5ad3622a)
+++ lams_central/conf/language/lams/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision 394f403c289f0fd7808c228840bead5c4e7d5d32)
@@ -70,7 +70,6 @@
title.error.window =LAMS :: Error
authoring.msg.save.success =Congratulations, your content saved successfully!
label.authoring.close =Close
-label.authoring.re.edit =Re-edit
index.welcome =Welcome
index.logout =Logout
index.refresh =Refresh
@@ -82,9 +81,11 @@
index.addlesson =Add Lesson
index.monitor =Monitor
index.dummymonitor =Dummy Monitor
+index.qb.collections =Question collections
title.import.result =Import tool content result
title.import =Import tool content
title.import.instruction =Please choose LAMS sequence to import.
+title.import.instruction.antivirus =An antivirus scan will be performed. It can take a while.
title.export.loading =Export tool content loading
label.ld.zip.file =Learning design import file
msg.import.success =Learning design and activities imported successfully.
@@ -402,6 +403,7 @@
authoring.fla.course.groups.to.branches.match.dialog.title =Match Course Groups to Branching Groups
authoring.fla.branch.mapping.course.groups.header =Course groups
authoring.fla.branch.mapping.branching.groups.header =Branching groups
+authoring.fla.branch.mapping.ordered.asc =Start with branches mapped to highest ordered answers
label.tab.advanced.field.force.restart =Learners always start from the first activity
label.tab.advanced.field.allow.restart =Learners can restart the lesson
label.verification.code =Verification code
@@ -791,7 +793,6 @@
label.view =View
index.outcome.manage =Outcomes
index.outcome.manage.tooltip =Manage learning outcomes and scales
-outcome.manage.title =Course outcomes
outcome.manage.remove =Remove outcome
outcome.manage.remove.confirm =Are you sure you want to remove this outcome?
outcome.manage.add =Add outcome
@@ -800,24 +801,21 @@
outcome.manage.add.name =Name
outcome.manage.add.code =Code
outcome.manage.add.description =Description
-outcome.manage.add.global =Global
outcome.manage.add.scale =Scale
outcome.manage.add.save =Save
-outcome.manage.scope =Scope
-outcome.manage.scope.global =global
-outcome.manage.scope.course =course
outcome.manage.add.error =Error while saving an outcome
outcome.manage.add.error.name.blank =Name can not be blank
outcome.manage.add.error.code.blank =Code can not be blank
outcome.manage.add.error.scale.choose =You have to choose a scale
+outcome.manage.remove.error.in.use =The outcome is mapped to some items. It can not be removed.
scale.title =Scales
scale.manage =Manage scales
scale.manage.add =Add scale
scale.manage.edit =Edit scale
scale.manage.view =View scale
-scale.manage.title =Course scales
scale.manage.remove =Remove scale
-scale.manage.remove.scale =Error while removing a scale. It is probably used in some outcomes.
+scale.manage.remove.scale =Error while removing a scale.
+scale.manage.remove.error.in.use =The scale is used in some outcomes. It can not be removed.
scale.manage.remove.confirm =Are you sure you want to remove this scale?
scale.manage.add.value =Values
scale.manage.add.value.info =Enter comma separated values in increasing order of value. For example, an A,B,C,D scale must be entered as D,C,B,A.
@@ -827,6 +825,7 @@
outcome.authoring.input =Search and select by outcome name or code
outcome.authoring.existing =Added outcomes
outcome.authoring.existing.none =none
+outcome.authoring.remove.confirm =Are you sure you want to remove this learning outcome?
outcome.export.date =Exported on:
outcome.export =Export
outcome.import =Import
@@ -837,47 +836,59 @@
authoring.template.list.introduction =Select a template from the list to see more details about the design that will be created. You can the proceed to create the design or return back to this list.
authoring.learning.design.templates =Learning Design Templates
authoring.template.successful =Your design has been saved as {0}.
-authoring.label.sequence.title =Title of Sequence
-authoring.error.question.num =Question {0} may not be blank
-authoring.error.question.correct.num =One of the answers for Question {0} needs to be correct.
+authoring.label.sequence.title =Name
+authoring.error.question.num =RAT Questions: Question {0} may not be blank
+authoring.error.question.correct.num =RAT Questions: One of the answers for Question {0} needs to be correct.
authoring.description.application.exercise =Application Exercise (These question(s) will be shown during the analysis phase in the sequence.)
-authoring.label.grouping =Grouping
+authoring.label.grouping =Teams
+authoring.label.group.name =Team_{0}
authoring.label.grouping.learners.choice =Learner's Choice
authoring.label.grouping.teachers.choice =Teacher's Choice
authoring.label.grouping.random.allocation =Random Allocation
-authoring.label.numgroups =Number of groups:
-authoring.error.numgroups =Number of groups must be 1 to 99.
+authoring.label.numgroups =Number of teams:
+authoring.error.numgroups =Number of teams must be 1 to 99.
authoring.label.numlearners =Number of learners:
authoring.error.numlearners =Number of learners must be 1 to 99.
-authoring.error.group.data =Group settings are not correct.
+authoring.error.group.data =Teams settings are not correct.
authoring.section.lessondetails =Lesson Details
-authoring.section.questions =Questions
-authoring.section.applicationexercise =Application Exercise
+authoring.section.questions =RAT Questions
+authoring.section.applicationexercise =Application Exercises
authoring.section.introduction =Introduction
-authoring.create.question =Create Question
-authoring.create.essay.question =Create Essay Question
-authoring.create.mc.question =Create Multiple Choice Question
+authoring.create.question =Add Question
+authoring.create.essay.question =Add Essay Question
+authoring.create.mc.question =Add Multiple Choice Question
authoring.label.application.exercise.num =Application Exercise {0}
-authoring.error.application.exercise.num =Application Exercise {0} may not be blank.
+authoring.error.application.exercise.num =Application Exercises: Application Exercise {0} may not be blank.
authoring.label.question.num =Question {0}
authoring.label.option.num =Option {0}
authoring.error.option =Option may not be blank
authoring.label.correct.question =Correct?
-authoring.create.option =Create Option
+authoring.create.option =Add Option
button.next =Next
button.previous =Previous
-button.return.to.template.list =Go back to Template list
+button.return.to.template.list =Back to Templates
authoring.error.content.id =Content ID is missing
-authoring.error.question.must.have.answer.num =Question {0} must have at least one answer.
-authoring.error.application.exercise.must.have.answer.num =Application Exercise {0} must have at least one answer.
-authoring.error.application.exercise.must.have.100.percent =Application Exercise {0} must have at least one answer worth 100%.
-authoring.error.application.exercise.not.blank.and.grade =Application Exercise {0} may not be blank and must have a grade.
+authoring.error.question.must.have.answer.num =RAT Questions: Question {0} must have at least one answer.
+authoring.error.application.exercise.question.must.not.be.blank.num =Application Exercises: {0} Question {1} may not be blank.
+authoring.error.application.exercise.must.have.answer.num =Application Exercises: {0} Question {1} must have at least one answer.
+authoring.error.application.exercise.must.have.100.percent =Application Exercises: {0} Question {1} must have at least one answer worth 100%.
+authoring.error.application.exercise.not.blank.and.grade =Application Exercises: {0} Question {1} may not be blank and must have a grade.
+authoring.error.application.exercise.needs.noticeboard.text =Application Exercises: {0} is missing the text for the noticeboard.
+authoring.error.rat.not.blank=RAT Questions: There must be at least one question.
authoring.label.grade =Grade
authoring.label.none =None
authoring.tbl.template.title =Team Based Learning
authoring.tbl.template.description =Individual and Team Readiness Assessments followed by Application Exercises.
-authoring.tbl.desc.question =These questions are for iRA and tRA. Click "Create Question" to add more questions. Turn on "Enable confidence levels" to have the learners' confidence levels from the iRA shown on the tRA screen.
-authoring.tbl.desc.ae =State the questions for AE. Click "Create Question" to add more questions.
+authoring.tbl.desc.question =Adding RAT questions.
+authoring.tbl.enable.confidence.tooltip =Asks students in the iRAT how confident they are with their choosen answer. Then the confidence level for each student is displayed in the tRAT to all members of their team.
+authoring.tbl.desc.ae =Adding Application Exercises (AEs). You can create multiple AEs if needed.
+authoring.template.basic.import.qti =Import IMS QTI
+authoring.tbl.use.noticeboard=Add Noticeboard after AE
+authoring.tbl.use.noticeboard.tooltip=After the AE, displays content to students as additional information or as a reflection on the AE topic
+authoring.create.application.exercise=Add New Application Exercise
+label.marks=Marks
+authoring.tbl.delete.appex.prompt=Do you want to delete the Application Exercise {0}?
+authoring.tbl.delete.mcq.prompt=Do you want to delete the RAT Question {0}?
#QB questions#
label.create.question =Create question
Index: lams_central/web/includes/javascript/ckconfig_custom.js
===================================================================
diff -u -rebf117035c692f7069000d6b7bace23cfc94619a -r394f403c289f0fd7808c228840bead5c4e7d5d32
--- lams_central/web/includes/javascript/ckconfig_custom.js (.../ckconfig_custom.js) (revision ebf117035c692f7069000d6b7bace23cfc94619a)
+++ lams_central/web/includes/javascript/ckconfig_custom.js (.../ckconfig_custom.js) (revision 394f403c289f0fd7808c228840bead5c4e7d5d32)
@@ -131,7 +131,7 @@
CKEDITOR.config.format_tags = 'div;h1;h2;h3;h4;h5;h6;pre;address;p' ;
CKEDITOR.config.enterMode = 'div';
CKEDITOR.plugins.addExternal('wikilink', CKEDITOR.basePath + '../tool/lawiki10/wikilink/', 'plugin.js');
-CKEDITOR.config.extraPlugins = 'wikilink,jlatexmath,image2,html5audio,bootstrapTabs,bootpanel,bootsnippets';
+CKEDITOR.config.extraPlugins = 'wikilink,jlatexmath,image2,html5audio,confighelper,bootstrapTabs,bootpanel,bootsnippets';
CKEDITOR.config.enterMode = CKEDITOR.ENTER_DIV;
CKEDITOR.config.removePlugins = 'elementspath,about,specialchar';
CKEDITOR.config.allowedContent = true;
@@ -145,6 +145,16 @@
// ---- Additional scripts -----
CKEDITOR.on('instanceReady', function(e){
+ //add custom classes
+ var classes = e.editor.config.classes;
+ if (classes) {
+ for (classIter of classes.split(' ')) {
+ if (classIter) {
+ e.editor._.editable.$.classList.add(classIter);
+ }
+ }
+ }
+
//set min-height CSS property
var height = e.editor.config.height;
if ( ! height ) {
@@ -169,4 +179,22 @@
f.data.dataValue = tempDiv.innerHTML;
});
+
+ //function adds "cke_filled" class to CKEditor, if it's not empty. And removes it otherwise.
+ var placeholderLessenHandler = function(editor) {
+ var ckeditorData = editor.getData();
+
+ var isEmpty = (ckeditorData == null) || (ckeditorData.replace(/ | | |\s|
|<\/p>|\xa0/g, "").length == 0);
+ if (isEmpty) {
+ editor._.editable.$.classList.remove("cke_filled");
+ } else {
+ editor._.editable.$.classList.add("cke_filled");
+ }
+ }
+ //add cke_filled class on editor's instanceReady
+ placeholderLessenHandler(e.editor);
+ //add cke_filled class on editor gets changed
+ e.editor.on('change', function(event) {
+ placeholderLessenHandler(event.editor);
+ });
});
Index: lams_common/src/java/org/lamsfoundation/lams/commonContext.xml
===================================================================
diff -u -rf30bbddfb24ca43e7a57fc79f8628b67911df505 -r394f403c289f0fd7808c228840bead5c4e7d5d32
--- lams_common/src/java/org/lamsfoundation/lams/commonContext.xml (.../commonContext.xml) (revision f30bbddfb24ca43e7a57fc79f8628b67911df505)
+++ lams_common/src/java/org/lamsfoundation/lams/commonContext.xml (.../commonContext.xml) (revision 394f403c289f0fd7808c228840bead5c4e7d5d32)
@@ -30,6 +30,7 @@
org.lamsfoundation.lams.outcomeorg.lamsfoundation.lams.plannerorg.lamsfoundation.lams.policies
+ org.lamsfoundation.lams.qborg.lamsfoundation.lams.themesorg.lamsfoundation.lams.timezoneorg.lamsfoundation.lams.tool
@@ -540,7 +541,31 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+
+
+
+
+
+
+
+ PROPAGATION_REQUIRED
+
+
+
+
@@ -684,6 +709,10 @@
+
+
+
+
_ appended
- public static String SUFFIX_IMPORTED_LD = "SuffixImportedLD";
-
- // LDEV-3254
- public static String CONFIGURATION_CACHE_REFRESH_INTERVAL = "ConfigCacheRefreshInterval";
-
- // LDEV-3961
- public static String SITE_NAME = "SiteName";
-
- // LDEV-4023 Password policy
- public static String PASSWORD_POLICY_MINIMUM_CHARACTERS = "PasswordPolicyMinChars";
-
- public static String PASSWORD_POLICY_UPPERCASE = "PasswordPolicyUppercase";
-
- public static String PASSWORD_POLICY_LOWERCASE = "PasswordPolicyLowercase";
-
- public static String PASSWORD_POLICY_NUMERICS = "PasswordPolicyNumerics";
-
- public static String PASSWORD_POLICY_SYMBOLS = "PasswordPolicySymbols";
-
- // LDEV-4049 Option for not displaying stacktraces in config settings
- public static String ERROR_STACK_TRACE = "ErrorStackTrace";
-
- // LDEV-4030 Disable login for a few minutes after X number of attempts
- public static String FAILED_ATTEMPTS = "FailedAttempts";
-
- public static String LOCK_OUT_TIME = "LockOutTime";
-
- // LDEV-4144
- public static String SHOW_TIMEZONE_WARNING = "ShowTimezoneWarning";
-
- // LDEV-4594 / LDEV-4583 Allow/Block access to index.do for integration learners. Default to false - do not allow direct access.
- public static String ALLOW_DIRECT_ACCESS_FOR_INTEGRATION_LEARNERS = "AllowDirectAccessIntgrtnLrnr";
-
- // LDEV-4755 Antivirus
- public static String ANTIVIRUS_ENABLE = "AntivirusEnable";
- public static String ANTIVIRUS_HOST = "AntivirusHost";
- public static String ANTIVIRUS_PORT = "AntivirusPort";
-
- // LDEV-4819
- public static String LEARNING_OUTCOME_QUICK_ADD_ENABLE = "LearningOutcomeQuickAddEnable";
-
-}
+/****************************************************************
+ * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org)
+ * =============================================================
+ * License Information: http://lamsfoundation.org/licensing/lams/2.0/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2.0
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
+ * USA
+ *
+ * http://www.gnu.org/licenses/gpl.txt
+ * ****************************************************************
+ */
+
+package org.lamsfoundation.lams.util;
+
+/**
+ * Known keys for the configuration data.
+ *
+ * @author fmalikoff
+ *
+ */
+public class ConfigurationKeys {
+
+ public static String ROOT = "Lams";
+
+ public static String SERVER_URL = "ServerURL";
+
+ public static String SERVER_URL_CONTEXT_PATH = "ServerURLContextPath";
+
+ public static String VERSION = "Version";
+
+ public static String LAMS_TEMP_DIR = "TempDir";
+
+ /**
+ * Directory in which lams.ear is deployed. Usually {JBOSS}/server/default/deploy/lams.ear
+ */
+ public static String LAMS_EAR_DIR = "EARDir";
+
+ public static String SMTP_SERVER = "SMTPServer";
+
+ public static String SMTP_PORT = "SMTPPort";
+
+ public static String LAMS_ADMIN_EMAIL = "LamsSupportEmail";
+
+ public static String CONTENT_REPOSITORY_PATH = "ContentRepositoryPath";
+
+ public static String UPLOAD_FILE_MAX_SIZE = "UploadFileMaxSize";
+
+ public static String UPLOAD_FILE_LARGE_MAX_SIZE = "UploadLargeFileMaxSize";
+
+ public static String UPLOAD_FILE_MAX_MEMORY_SIZE = "UploadFileMaxMemorySize";
+
+ public static String CHAT_SERVER_NAME = "ChatServerName";
+
+ public static String CHAT_PORT_NUMBER = "ChatPortNumber";
+
+ public static String EXE_EXTENSIONS = "ExecutableExtensions";
+
+ public static String LICENSE_TICKET_FILE = "TicketFile";
+
+ public static String PREVIEW_CLEANUP_NUM_DAYS = "CleanupPreviewOlderThanDays";
+
+ /**
+ * Number of seconds before a user is considered "inactive" and gets logged out.
+ */
+ public static String INACTIVE_TIME = "UserInactiveTimeout";
+
+ /**
+ * Allow more than one session to exist for one user. Needed for the test harness Do not set this parameter to true
+ * in production.
+ */
+ public static String ALLOW_MULTIPLE_LOGIN = "AllowMultipleLogin";
+
+ /** Values for client updates */
+ public static String SERVER_VERSION_NUMBER = "ServerVersionNumber";
+
+ /** Default locale for the server. Originally en_AU */
+ public static String SERVER_LANGUAGE = "ServerLanguage";
+
+ /**
+ * Default country for the server. Originally AU
+ */
+ public static String SERVER_COUNTRY = "ServerCountry";
+
+ /**
+ * Direction (left to right, right to left) for writing on HTML pages. Originally LTR
+ */
+ public static String SERVER_PAGE_DIRECTION = "ServerPageDirection";
+
+ /** universal date of dictionary updates */
+ public static String DICTIONARY_DATE_CREATED = "DictionaryDateCreated";
+
+ public static String HELP_URL = "HelpURL";
+
+ public static String XMPP_DOMAIN = "XmppDomain";
+
+ public static String XMPP_CONFERENCE = "XmppConference";
+
+ public static String XMPP_ADMIN = "XmppAdmin";
+
+ public static String XMPP_PASSWORD = "XmppPassword";
+
+ public static String DEFAULT_THEME = "DefaultTheme";
+
+ public static String ALLOW_DIRECT_LESSON_LAUNCH = "AllowDirectLessonLaunch";
+
+ public static String ALLOW_EDIT_ON_FLY = "AllowLiveEdit";
+
+ public static String ALLOW_KUMALIVE = "AllowKumalive";
+
+ public static String DISPLAY_PORTRAIT = "DisplayPortrait";
+
+ public static String ENABLE_PORTRAIT_EDITING = "EnablePortraitEditing";
+
+ public static String SHOW_ALL_MY_LESSON_LINK = "ShowAllMyLessonLink";
+
+ public static String LDAP_PROVISIONING_ENABLED = "LDAPProvisioningEnabled";
+
+ public static String LDAP_PROVIDER_URL = "LDAPProviderURL";
+
+ public static String LDAP_SECURITY_AUTHENTICATION = "LDAPSecurityAuthentication";
+
+ public static String LDAP_SEARCH_FILTER = "LDAPSearchFilter";
+
+ public static String LDAP_BASE_DN = "LDAPBaseDN";
+
+ public static String LDAP_BIND_USER_DN = "LDAPBindUserDN";
+
+ public static String LDAP_BIND_USER_PASSWORD = "LDAPBindUserPassword";
+
+ public static String LDAP_SECURITY_PROTOCOL = "LDAPSecurityProtocol";
+
+ public static String LDAP_LOGIN_ATTR = "LDAPLoginAttr";
+
+ public static String LDAP_FIRST_NAME_ATTR = "LDAPFNameAttr";
+
+ public static String LDAP_LAST_NAME_ATTR = "LDAPLNameAttr";
+
+ public static String LDAP_EMAIL_ATTR = "LDAPEmailAttr";
+
+ public static String LDAP_ADDR1_ATTR = "LDAPAddr1Attr";
+
+ public static String LDAP_ADDR2_ATTR = "LDAPAddr2Attr";
+
+ public static String LDAP_ADDR3_ATTR = "LDAPAddr3Attr";
+
+ public static String LDAP_CITY_ATTR = "LDAPCityAttr";
+
+ public static String LDAP_STATE_ATTR = "LDAPStateAttr";
+
+ public static String LDAP_POSTCODE_ATTR = "LDAPPostcodeAttr";
+
+ public static String LDAP_COUNTRY_ATTR = "LDAPCountryAttr";
+
+ public static String LDAP_DAY_PHONE_ATTR = "LDAPDayPhoneAttr";
+
+ public static String LDAP_EVENING_PHONE_ATTR = "LDAPEveningPhoneAttr";
+
+ public static String LDAP_FAX_ATTR = "LDAPFaxAttr";
+
+ public static String LDAP_MOBILE_ATTR = "LDAPMobileAttr";
+
+ public static String LDAP_LOCALE_ATTR = "LDAPLocaleAttr";
+
+ public static String LDAP_DISABLED_ATTR = "LDAPDisabledAttr";
+
+ public static String LDAP_ORG_ATTR = "LDAPOrgAttr";
+
+ public static String LDAP_ROLES_ATTR = "LDAPRolesAttr";
+
+ public static String LDAP_LEARNER_MAP = "LDAPLearnerMap";
+
+ public static String LDAP_MONITOR_MAP = "LDAPMonitorMap";
+
+ public static String LDAP_AUTHOR_MAP = "LDAPAuthorMap";
+
+ public static String LDAP_GROUP_ADMIN_MAP = "LDAPGroupAdminMap";
+
+ public static String LDAP_GROUP_MANAGER_MAP = "LDAPGroupManagerMap";
+
+ public static String LDAP_UPDATE_ON_LOGIN = "LDAPUpdateOnLogin";
+
+ public static String LDAP_ORG_FIELD = "LDAPOrgField";
+
+ public static String LDAP_ONLY_ONE_ORG = "LDAPOnlyOneOrg";
+
+ public static String LDAP_SEARCH_RESULTS_PAGE_SIZE = "LDAPSearchResultsPageSize";
+
+ /** Custom tab for the main page */
+ public static String CUSTOM_TAB_LINK = "CustomTabLink";
+
+ public static String CUSTOM_TAB_TITLE = "CustomTabTitle";
+
+ /**
+ * Configurable screen sizes for authoring, monitor, learner and admin (LDEV-1598)
+ */
+ public static String AUTHORING_SCREEN_SIZE = "AuthoringScreenSize";
+
+ public static String MONITOR_SCREEN_SIZE = "MonitorScreenSize";
+
+ public static String LEARNER_SCREEN_SIZE = "LearnerScreenSize";
+
+ public static String ADMIN_SCREEN_SIZE = "AdminScreenSize";
+
+ public static String GMAP_KEY = "GmapKey";
+
+ public static String RED5_SERVER_URL = "Red5ServerUrl";
+
+ public static String RED5_RECORDINGS_URL = "Red5RecordingsUrl";
+
+ public static String SMTP_AUTH_USER = "SMTPUser";
+
+ public static String SMTP_AUTH_PASSWORD = "SMTPPassword";
+
+ public static String SMTP_AUTH_SECURITY = "SMTPAuthSecurity";
+
+ public static String PROFILE_EDIT_ENABLE = "ProfileEditEnable";
+
+ public static String FORGOT_YOUR_PASSWORD_LINK_ENABLE = "EnableForgotYourPasswordLink";
+
+ public static String PROFILE_PARTIAL_EDIT_ENABLE = "ProfilePartialEditEnable";
+
+ public static String KALTURA_SERVER = "KalturaServer";
+
+ public static String KALTURA_PARTNER_ID = "KalturaPartnerId";
+
+ public static String KALTURA_SUB_PARTNER_ID = "KalturaSubPartnerId";
+
+ public static String KALTURA_USER_SECRET = "KalturaUserSecret";
+
+ public static String KALTURA_KCW_UI_CONF_ID = "KalturaKCWUiConfId";
+
+ public static String KALTURA_KDP_UI_CONF_ID = "KalturaKDPUiConfId";
+
+ public static String USER_VALIDATION_REQUIRED_USERNAME = "UserValidationUsername";
+
+ public static String USER_VALIDATION_REQUIRED_FIRST_LAST_NAME = "UserValidationFirstLastName";
+
+ public static String USER_VALIDATION_REQUIRED_EMAIL = "UserValidationEmail";
+
+ // LDEV-2747
+ public static String ENABLE_SERVER_REGISTRATION = "EnableServerRegistration";
+
+ // CNG-26 Add to lams_configuration and set to false
+ // if you don't want imported LD to have __ appended
+ public static String SUFFIX_IMPORTED_LD = "SuffixImportedLD";
+
+ // LDEV-3254
+ public static String CONFIGURATION_CACHE_REFRESH_INTERVAL = "ConfigCacheRefreshInterval";
+
+ // LDEV-3961
+ public static String SITE_NAME = "SiteName";
+
+ // LDEV-4023 Password policy
+ public static String PASSWORD_POLICY_MINIMUM_CHARACTERS = "PasswordPolicyMinChars";
+
+ public static String PASSWORD_POLICY_UPPERCASE = "PasswordPolicyUppercase";
+
+ public static String PASSWORD_POLICY_LOWERCASE = "PasswordPolicyLowercase";
+
+ public static String PASSWORD_POLICY_NUMERICS = "PasswordPolicyNumerics";
+
+ public static String PASSWORD_POLICY_SYMBOLS = "PasswordPolicySymbols";
+
+ // LDEV-4049 Option for not displaying stacktraces in config settings
+ public static String ERROR_STACK_TRACE = "ErrorStackTrace";
+
+ // LDEV-4030 Disable login for a few minutes after X number of attempts
+ public static String FAILED_ATTEMPTS = "FailedAttempts";
+
+ public static String LOCK_OUT_TIME = "LockOutTime";
+
+ // LDEV-4144
+ public static String SHOW_TIMEZONE_WARNING = "ShowTimezoneWarning";
+
+ // LDEV-4594 / LDEV-4583 Allow/Block access to index.do for integration learners. Default to false - do not allow direct access.
+ public static String ALLOW_DIRECT_ACCESS_FOR_INTEGRATION_LEARNERS = "AllowDirectAccessIntgrtnLrnr";
+
+ // LDEV-4755 Antivirus
+ public static String ANTIVIRUS_ENABLE = "AntivirusEnable";
+ public static String ANTIVIRUS_HOST = "AntivirusHost";
+ public static String ANTIVIRUS_PORT = "AntivirusPort";
+
+ // LDEV-4819
+ public static String LEARNING_OUTCOME_QUICK_ADD_ENABLE = "LearningOutcomeQuickAddEnable";
+
+ // LDEV-4827 Question Bank
+ public static String QB_QTI_ENABLE = "QbQtiEnable";
+ public static String QB_WORD_ENABLE = "QbWordEnable";
+ public static String QB_COLLECTIONS_CREATE_ALLOW = "QbCollectionsCreateEnable";
+ public static String QB_COLLECTIONS_TRANSFER_ALLOW = "QbCollectionsTransferEnable";
+ public static String QB_MONITORS_READ_ONLY = "QbMonitorsReadOnly";
+ public static String QB_STATS_MIN_PARTICIPANTS = "QbStatsMinParticipants";
+ public static String QB_STATS_GROUP_SIZE = "QbStatsGroupSize";
+}
Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/util/GradebookConstants.java
===================================================================
diff -u -r9f491bfb157944ee893c52fa819fad27de872f51 -r394f403c289f0fd7808c228840bead5c4e7d5d32
--- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/util/GradebookConstants.java (.../GradebookConstants.java) (revision 9f491bfb157944ee893c52fa819fad27de872f51)
+++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/util/GradebookConstants.java (.../GradebookConstants.java) (revision 394f403c289f0fd7808c228840bead5c4e7d5d32)
@@ -1,88 +1,84 @@
-/****************************************************************
- * Copyright (C) 2008 LAMS Foundation (http://lamsfoundation.org)
- * =============================================================
- * License Information: http://lamsfoundation.org/licensing/lams/2.0/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2.0
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * USA
- *
- * http://www.gnu.org/licenses/gpl.txt
- * ****************************************************************
- */
-
-package org.lamsfoundation.lams.gradebook.util;
-
-/**
- * Constants for gradebook module
- *
- * @author lfoxton
- *
- */
-public class GradebookConstants {
-
- public static final String MODULE_NAME = "gradebook";
-
- // Parameters
- public static final String PARAM_LOGIN = "login";
- public static final String PARAM_ID = "id";
- public static final String PARAM_MARK = "mark";
- public static final String PARAM_FEEDBACK = "feedback";
- public static final String PARAM_USERID = "userID";
- public static final String PARAM_SEARCH = "_search";
- public static final String PARAM_SEARCH_FIELD = "searchField";
- public static final String PARAM_SEARCH_OPERATION = "searchOper";
- public static final String PARAM_SEARCH_STRING = "searchString";
- public static final String PARAM_ROW_NAME = "rowName";
- public static final String PARAM_TIME_TAKEN = "timeTaken";
- public static final String PARAM_AVG_TIME_TAKEN = "avgTimeTaken";
- public static final String PARAM_AVG_MARK = "avgMark";
- public static final String PARAM_VIEW = "view";
- public static final String PARAM_START_DATE = "startDate";
- public static final String PARAM_GROUP_ID = "groupId";
- public static final String PARAM_SEQUENCE = "sequence";
-
- // Sort
- public static final String SORT_DESC = "desc";
- public static final String SORT_ASC = "asc";
-
- // Search
- public static final String SEARCH_EQUALS = "eq";
- public static final String SEARCH_NOT_EQUALS = "ne";
- public static final String SEARCH_BEGINS_WITH = "bw";
- public static final String SEARCH_ENDS_WITH = "ew";
- public static final String SEARCH_CONTAINS = "cn";
-
- // Views
- public static final String VIEW_MON_ACTIVITY = "monActivityView";
- public static final String VIEW_MON_USER = "monUserView";
- public static final String VIEW_MON_COURSE = "monCourse";
- public static final String VIEW_LRN_COURSE = "lrnCourse";
- public static final String VIEW_LRN_ACTIVITY = "lrnActivity";
- public static final String VIEW_LIST = "listView";
-
- // XML Elemetns
- public static final String ELEMENT_ROWS = "rows";
- public static final String ELEMENT_PAGE = "page";
- public static final String ELEMENT_TOTAL = "total";
- public static final String ELEMENT_RECORDS = "records";
- public static final String ELEMENT_ROW = "row";
- public static final String ELEMENT_ID = "id";
- public static final String ELEMENT_CELL = "cell";
-
- // Misc
- public static final String CONTENT_TYPE_TEXTXML = "text/xml";
- public static final String CONTENT_TYPE_TEXTPLAIN = "text/plain";
- public static final String CELL_EMPTY = "-";
- public static final String UTF8 = "UTF8";
-
-}
+/****************************************************************
+ * Copyright (C) 2008 LAMS Foundation (http://lamsfoundation.org)
+ * =============================================================
+ * License Information: http://lamsfoundation.org/licensing/lams/2.0/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2.0
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * USA
+ *
+ * http://www.gnu.org/licenses/gpl.txt
+ * ****************************************************************
+ */
+
+package org.lamsfoundation.lams.gradebook.util;
+
+/**
+ * Constants for gradebook module
+ *
+ * @author lfoxton
+ *
+ */
+public class GradebookConstants {
+
+ public static final String MODULE_NAME = "gradebook";
+
+ // Parameters
+ public static final String PARAM_LOGIN = "login";
+ public static final String PARAM_ID = "id";
+ public static final String PARAM_MARK = "mark";
+ public static final String PARAM_FEEDBACK = "feedback";
+ public static final String PARAM_USERID = "userID";
+ public static final String PARAM_ROW_NAME = "rowName";
+ public static final String PARAM_TIME_TAKEN = "timeTaken";
+ public static final String PARAM_AVG_TIME_TAKEN = "avgTimeTaken";
+ public static final String PARAM_AVG_MARK = "avgMark";
+ public static final String PARAM_VIEW = "view";
+ public static final String PARAM_START_DATE = "startDate";
+ public static final String PARAM_GROUP_ID = "groupId";
+ public static final String PARAM_SEQUENCE = "sequence";
+
+ // Sort
+ public static final String SORT_DESC = "desc";
+ public static final String SORT_ASC = "asc";
+
+ // Search
+ public static final String SEARCH_EQUALS = "eq";
+ public static final String SEARCH_NOT_EQUALS = "ne";
+ public static final String SEARCH_BEGINS_WITH = "bw";
+ public static final String SEARCH_ENDS_WITH = "ew";
+ public static final String SEARCH_CONTAINS = "cn";
+
+ // Views
+ public static final String VIEW_MON_ACTIVITY = "monActivityView";
+ public static final String VIEW_MON_USER = "monUserView";
+ public static final String VIEW_MON_COURSE = "monCourse";
+ public static final String VIEW_LRN_COURSE = "lrnCourse";
+ public static final String VIEW_LRN_ACTIVITY = "lrnActivity";
+ public static final String VIEW_LIST = "listView";
+
+ // XML Elemetns
+ public static final String ELEMENT_ROWS = "rows";
+ public static final String ELEMENT_PAGE = "page";
+ public static final String ELEMENT_TOTAL = "total";
+ public static final String ELEMENT_RECORDS = "records";
+ public static final String ELEMENT_ROW = "row";
+ public static final String ELEMENT_ID = "id";
+ public static final String ELEMENT_CELL = "cell";
+
+ // Misc
+ public static final String CONTENT_TYPE_TEXTXML = "text/xml";
+ public static final String CONTENT_TYPE_TEXTPLAIN = "text/plain";
+ public static final String CELL_EMPTY = "-";
+ public static final String UTF8 = "UTF8";
+
+}
Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/web/controller/GradebookController.java
===================================================================
diff -u -r679782834f99e7e2699f9f34ae8bf1c75abc7bb5 -r394f403c289f0fd7808c228840bead5c4e7d5d32
--- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/web/controller/GradebookController.java (.../GradebookController.java) (revision 679782834f99e7e2699f9f34ae8bf1c75abc7bb5)
+++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/web/controller/GradebookController.java (.../GradebookController.java) (revision 394f403c289f0fd7808c228840bead5c4e7d5d32)
@@ -1,626 +1,626 @@
-/****************************************************************
- * Copyright (C) 2008 LAMS Foundation (http://lamsfoundation.org)
- * =============================================================
- * License Information: http://lamsfoundation.org/licensing/lams/2.0/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2.0
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * USA
- *
- * http://www.gnu.org/licenses/gpl.txt
- * ****************************************************************
- */
-
-package org.lamsfoundation.lams.gradebook.web.controller;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
-
-import org.apache.log4j.Logger;
-import org.lamsfoundation.lams.gradebook.GradebookUserLesson;
-import org.lamsfoundation.lams.gradebook.dto.GBLessonGridRowDTO;
-import org.lamsfoundation.lams.gradebook.dto.GBUserGridRowDTO;
-import org.lamsfoundation.lams.gradebook.dto.GradebookGridRowDTO;
-import org.lamsfoundation.lams.gradebook.service.IGradebookFullService;
-import org.lamsfoundation.lams.gradebook.util.GBGridView;
-import org.lamsfoundation.lams.gradebook.util.GradebookConstants;
-import org.lamsfoundation.lams.gradebook.util.GradebookUtil;
-import org.lamsfoundation.lams.learning.service.ILearnerService;
-import org.lamsfoundation.lams.learningdesign.Activity;
-import org.lamsfoundation.lams.learningdesign.Group;
-import org.lamsfoundation.lams.learningdesign.ToolActivity;
-import org.lamsfoundation.lams.learningdesign.dto.ActivityURL;
-import org.lamsfoundation.lams.lesson.Lesson;
-import org.lamsfoundation.lams.lesson.service.ILessonService;
-import org.lamsfoundation.lams.security.ISecurityService;
-import org.lamsfoundation.lams.usermanagement.Organisation;
-import org.lamsfoundation.lams.usermanagement.Role;
-import org.lamsfoundation.lams.usermanagement.User;
-import org.lamsfoundation.lams.usermanagement.dto.UserDTO;
-import org.lamsfoundation.lams.usermanagement.service.IUserManagementService;
-import org.lamsfoundation.lams.util.CommonConstants;
-import org.lamsfoundation.lams.util.Configuration;
-import org.lamsfoundation.lams.util.ConfigurationKeys;
-import org.lamsfoundation.lams.util.WebUtil;
-import org.lamsfoundation.lams.web.session.SessionManager;
-import org.lamsfoundation.lams.web.util.AttributeNames;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.JsonNodeFactory;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
-/**
- * Handles the general requests for content in gradebook
- *
- * @author lfoxton
- */
-@Controller
-@RequestMapping("/gradebook")
-public class GradebookController {
- private static Logger logger = Logger.getLogger(GradebookController.class);
-
- @Autowired
- private IGradebookFullService gradebookService;
- @Autowired
- private IUserManagementService userManagementService;
- @Autowired
- private ILessonService lessonService;
- @Autowired
- private ISecurityService securityService;
- @Autowired
- private ILearnerService learnerService;
-
- @RequestMapping("")
- @ResponseBody
- public void unspecified() throws Exception {
- }
-
- /**
- * Returns an xml representation of the activity grid for gradebook
- *
- * This has two modes, userView and activityView
- *
- * User view will get the grid data for a specified user, which is all their activity marks/outputs etc
- *
- * Activity view will get the grid data for all activities, without user info, instead there is an average mark for
- * each activity.
- */
- @RequestMapping("/getActivityGridData")
- @ResponseBody
- public String getActivityGridData(HttpServletRequest request, HttpServletResponse response) throws Exception {
- // Getting the params passed in from the jqGrid
- int page = WebUtil.readIntParam(request, CommonConstants.PARAM_PAGE);
- int rowLimit = WebUtil.readIntParam(request, CommonConstants.PARAM_ROWS);
- String sortOrder = WebUtil.readStrParam(request, CommonConstants.PARAM_SORD);
- String sortBy = WebUtil.readStrParam(request, CommonConstants.PARAM_SIDX, true);
- Boolean isSearch = WebUtil.readBooleanParam(request, GradebookConstants.PARAM_SEARCH);
- String searchField = WebUtil.readStrParam(request, GradebookConstants.PARAM_SEARCH_FIELD, true);
- String searchOper = WebUtil.readStrParam(request, GradebookConstants.PARAM_SEARCH_OPERATION, true);
- String searchString = WebUtil.readStrParam(request, GradebookConstants.PARAM_SEARCH_STRING, true);
- GBGridView view = GradebookUtil.readGBGridViewParam(request, GradebookConstants.PARAM_VIEW, false);
-
- Long lessonID = WebUtil.readLongParam(request, AttributeNames.PARAM_LESSON_ID);
- if (!securityService.isLessonParticipant(lessonID, getUser().getUserID(), "get activity gradebook data",
- false)) {
- response.sendError(HttpServletResponse.SC_FORBIDDEN, "User is not a learner in the lesson");
- return null;
- }
-
- // Getting userID param, it is passed differently from different views
- UserDTO currentUserDTO = getUser();
- Integer userID = null;
- if (view == GBGridView.MON_USER) {
- userID = WebUtil.readIntParam(request, GradebookConstants.PARAM_USERID);
- } else if (view == GBGridView.LRN_ACTIVITY) {
- if (currentUserDTO != null) {
- userID = currentUserDTO.getUserID();
- }
- }
-
- List gradebookActivityDTOs = new ArrayList<>();
-
- // Get the user gradebook list from the db
- // A slightly different list is needed for userview or activity view
- if ((view == GBGridView.MON_USER) || (view == GBGridView.LRN_ACTIVITY)) {//2nd level && from personal marks page (2nd level or 1st)
- gradebookActivityDTOs = gradebookService.getGBActivityRowsForLearner(lessonID, userID,
- currentUserDTO.getTimeZone());
- } else if (view == GBGridView.MON_ACTIVITY) {
- gradebookActivityDTOs = gradebookService.getGBActivityRowsForLesson(lessonID, currentUserDTO.getTimeZone(),
- true);
- }
-
- if ((sortBy == null) || sortBy.equals("")) {
- sortBy = GradebookConstants.PARAM_START_DATE;
- }
-
- String ret = GradebookUtil.toGridXML(gradebookActivityDTOs, view, sortBy, isSearch, searchField, searchOper,
- searchString, sortOrder, rowLimit, page);
-
- response.setContentType("text/xml; charset=utf-8");
- return ret;
- }
-
- @RequestMapping("/getActivityArchiveGridData")
- @ResponseBody
- public String getActivityArchiveGridData(HttpServletRequest request, HttpServletResponse response)
- throws Exception {
- GBGridView view = GradebookUtil.readGBGridViewParam(request, GradebookConstants.PARAM_VIEW, false);
-
- Long lessonID = WebUtil.readLongParam(request, AttributeNames.PARAM_LESSON_ID);
- Long activityID = WebUtil.readLongParam(request, AttributeNames.PARAM_ACTIVITY_ID);
- if (!securityService.isLessonParticipant(lessonID, getUser().getUserID(), "get activity archive gradebook data",
- false)) {
- response.sendError(HttpServletResponse.SC_FORBIDDEN, "User is not a learner in the lesson");
- return null;
- }
-
- // Getting userID param, it is passed differently from different views
- UserDTO currentUserDTO = getUser();
- Integer userID = null;
- if (view == GBGridView.MON_USER || view == GBGridView.MON_ACTIVITY) {
- userID = WebUtil.readIntParam(request, GradebookConstants.PARAM_USERID);
- } else if (view == GBGridView.LRN_ACTIVITY) {
- if (currentUserDTO != null) {
- userID = currentUserDTO.getUserID();
- }
- }
-
- List gradebookActivityDTOs = new ArrayList<>();
-
- // Get the user gradebook list from the db
- // A slightly different list is needed for userview or activity view
- if ((view == GBGridView.MON_USER) || (view == GBGridView.LRN_ACTIVITY) || (view == GBGridView.MON_ACTIVITY)) {//2nd level && from personal marks page (2nd level or 1st)
- gradebookActivityDTOs = gradebookService.getGBActivityArchiveRowsForLearner(activityID, userID,
- currentUserDTO.getTimeZone());
- }
-
- String ret = GradebookUtil.toGridXML(gradebookActivityDTOs, view, GradebookConstants.PARAM_ID, false, null,
- null, null, GradebookConstants.SORT_DESC, 100, 1);
-
- response.setContentType("text/xml; charset=utf-8");
- return ret;
- }
-
- @SuppressWarnings("unchecked")
- @RequestMapping("/getLessonCompleteGridData")
- @ResponseBody
- public String getLessonCompleteGridData(HttpServletRequest request, HttpServletResponse response) throws Exception {
- // Getting the params passed in from the jqGrid
- Long lessonId = WebUtil.readLongParam(request, AttributeNames.PARAM_LESSON_ID);
- UserDTO currentUserDTO = getUser();
- Integer userId = currentUserDTO.getUserID();
- if (!securityService.isLessonParticipant(lessonId, userId, "get lesson complete gradebook data", false)) {
- response.sendError(HttpServletResponse.SC_FORBIDDEN, "User is not a learner in the lesson");
- }
-
- List gradebookActivityDTOs = gradebookService.getGBLessonComplete(lessonId, userId);
-
- ObjectNode resultJSON = JsonNodeFactory.instance.objectNode();
- resultJSON.put(CommonConstants.ELEMENT_RECORDS, gradebookActivityDTOs.size());
-
- ArrayNode rowsJSON = JsonNodeFactory.instance.arrayNode();
- for (GradebookGridRowDTO gradebookActivityDTO : gradebookActivityDTOs) {
- ObjectNode rowJSON = JsonNodeFactory.instance.objectNode();
- String id = gradebookActivityDTO.getId();
- String[] idParts = id.split("_");
- if (idParts.length > 1) {
- // if activity is grouped, use just the real activity ID and leave out group ID
- // as we know there will be no ID clash in this single learner gradebook table
- id = idParts[0];
- }
- rowJSON.put(GradebookConstants.ELEMENT_ID, id);
-
- ArrayNode cellJSON = JsonNodeFactory.instance.arrayNode();
- cellJSON.add(gradebookActivityDTO.getRowName());
- cellJSON.add(gradebookActivityDTO.getStatus());
- cellJSON.add(gradebookActivityDTO.getAverageMark() == null ? GradebookConstants.CELL_EMPTY
- : GradebookUtil.niceFormatting(gradebookActivityDTO.getAverageMark()));
- cellJSON.add(gradebookActivityDTO.getMark() == null ? GradebookConstants.CELL_EMPTY
- : GradebookUtil.niceFormatting(gradebookActivityDTO.getMark()));
-
- rowJSON.set(CommonConstants.ELEMENT_CELL, cellJSON);
- rowsJSON.add(rowJSON);
- }
- resultJSON.set(CommonConstants.ELEMENT_ROWS, rowsJSON);
-
- // make a mapping of activity ID -> URL, same as in progress bar
- ObjectNode activityURLJSON = JsonNodeFactory.instance.objectNode();
- Object[] ret = learnerService.getStructuredActivityURLs(userId, lessonId);
- for (ActivityURL activity : (List) ret[0]) {
- String url = activity.getUrl();
- if (url != null) {
- if (url.startsWith("learner.do")) {
- url = "learning/" + url;
- }
- String serverUrl = Configuration.get(ConfigurationKeys.SERVER_URL);
- if (!url.startsWith(serverUrl)) {
- // monitor mode URLs should be prepended with server URL
- url = serverUrl + url;
- }
- activityURLJSON.put(activity.getActivityId().toString(), activity.getUrl());
- }
- }
- resultJSON.set("urls", activityURLJSON);
-
- boolean isWeighted = gradebookService.isWeightedMarks(lessonId);
- GradebookUserLesson gradebookUserLesson = gradebookService.getGradebookUserLesson(lessonId, userId);
- resultJSON.put("learnerLessonMark",
- gradebookUserLesson == null || gradebookUserLesson.getMark() == null ? GradebookConstants.CELL_EMPTY
- : GradebookUtil.niceFormatting(gradebookUserLesson.getMark(), isWeighted));
- Double averageLessonMark = gradebookService.getAverageMarkForLesson(lessonId);
- resultJSON.put("averageLessonMark", averageLessonMark == null ? GradebookConstants.CELL_EMPTY
- : GradebookUtil.niceFormatting(averageLessonMark, isWeighted));
-
- response.setContentType("application/json;charset=utf-8");
- return resultJSON.toString();
- }
-
- /**
- * Returns an xml representation of the user grid for gradebook
- *
- * This has three modes: userView, activityView and courseMonitorView
- *
- * User view will get all the learners in a lesson and print their gradebook data with their mark for the entire
- * lesson
- *
- * Activity view will take an extra parameter (activityID) and instead show the user's mark just for one activity
- *
- * Course monitor view gets the same as the user view, but the link is set to the lesson level gradebook instead of
- * learner.
- */
- @RequestMapping("/getUserGridData")
- @ResponseBody
- public String getUserGridData(HttpServletRequest request, HttpServletResponse response) throws Exception {
-
- // Getting the params passed in from the jqGrid
- int page = WebUtil.readIntParam(request, CommonConstants.PARAM_PAGE);
- int rowLimit = WebUtil.readIntParam(request, CommonConstants.PARAM_ROWS);
- String sortOrder = WebUtil.readStrParam(request, CommonConstants.PARAM_SORD);
- String sortBy = WebUtil.readStrParam(request, CommonConstants.PARAM_SIDX, true);
- Boolean isSearch = WebUtil.readBooleanParam(request, GradebookConstants.PARAM_SEARCH);
- String searchField = WebUtil.readStrParam(request, GradebookConstants.PARAM_SEARCH_FIELD, true);
- String searchString = WebUtil.readStrParam(request, GradebookConstants.PARAM_SEARCH_STRING, true);
- GBGridView view = GradebookUtil.readGBGridViewParam(request, GradebookConstants.PARAM_VIEW, false);
- Long lessonID = WebUtil.readLongParam(request, AttributeNames.PARAM_LESSON_ID, true);
- Integer organisationID = WebUtil.readIntParam(request, AttributeNames.PARAM_ORGANISATION_ID, true);
- UserDTO user = getUser();
-
- // in case of toolbar searching (which uses different parameters than a single field searching) get those
- // parameters
- if (isSearch && (searchField == null)) {
- searchField = GradebookConstants.PARAM_ROW_NAME;
- searchString = WebUtil.readStrParam(request, GradebookConstants.PARAM_ROW_NAME, true);
- }
-
- // Get the user gradebook list from the db
- List gradebookUserDTOs = new ArrayList<>();
-
- int totalUsers = 0;
- // if leesonID is specified show results based on lesson
- if (lessonID != null) {
- if (!securityService.isLessonMonitor(lessonID, user.getUserID(), "get gradebook", false)) {
- response.sendError(HttpServletResponse.SC_FORBIDDEN, "User is not a monitor in the lesson");
- return null;
- }
-
- Lesson lesson = lessonService.getLesson(lessonID);
- //GBGridView.MON_USER - 1st table of gradebook lesson monitor
- //GBGridView.MON_COURSE - Subgrid of 1st table of gradebook course monitor
- if (view == GBGridView.MON_USER || view == GBGridView.MON_COURSE) {
- gradebookUserDTOs = gradebookService.getGBUserRowsForLesson(lesson, page - 1, rowLimit, sortBy,
- sortOrder, searchString, user.getTimeZone());
- totalUsers = lesson.getAllLearners().size();
-
- // Subgrid of 2nd table of gradebook lesson monitor
- } else if (view == GBGridView.MON_ACTIVITY) {
- String rowID = WebUtil.readStrParam(request, AttributeNames.PARAM_ACTIVITY_ID);
-
- Long activityID = null;
-
- // Splitting the rowID param to get the activity/group id pair
- String[] split = rowID.split("_");
- if (split.length == 2) {
- activityID = Long.parseLong(split[0]);
- } else {
- activityID = Long.parseLong(rowID);
- }
-
- // Getting the group id if it is there
- Long groupId = WebUtil.readLongParam(request, GradebookConstants.PARAM_GROUP_ID, true);
-
- Activity activity = gradebookService.getActivityById(activityID);
- if ((activity != null) && (activity instanceof ToolActivity)) {
- gradebookUserDTOs = gradebookService.getGBUserRowsForActivity(lesson, (ToolActivity) activity,
- groupId, page - 1, rowLimit, sortBy, sortOrder, searchString, user.getTimeZone());
-
- //calculate totalUsers
- totalUsers = lesson.getAllLearners().size();
- if (groupId != null) {
- Group group = (Group) userManagementService.findById(Group.class, groupId);
- if (group != null) {
- totalUsers = group.getUsers().size();
- }
- }
-
- } else {
- // return null and the grid will report an error
- logger.error("No activity found for: " + activityID);
- return null;
- }
- }
-
- // 2nd table of gradebook course monitor
- // if organisationID is specified (but not lessonID) then show results for organisation
- } else if (organisationID != null) {
- if (!securityService.isGroupMonitor(organisationID, user.getUserID(), "get gradebook", false)) {
- response.sendError(HttpServletResponse.SC_FORBIDDEN, "User is not a monitor in the organisation");
- return null;
- }
-
- Organisation org = (Organisation) userManagementService.findById(Organisation.class, organisationID);
- gradebookUserDTOs = gradebookService.getGBUserRowsForOrganisation(org, page - 1, rowLimit, sortOrder,
- searchString);
- totalUsers = gradebookService.getCountUsersByOrganisation(organisationID, searchString);
-
- } else {
- logger.error("Missing parameters: either lessonID or organisationID should be specified.");
- response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Missing parameters");
- return null;
- }
-
- //calculate totalPages
- int totalPages = new Double(
- Math.ceil(new Integer(totalUsers).doubleValue() / new Integer(rowLimit).doubleValue())).intValue();
- String ret = GradebookUtil.toGridXML(gradebookUserDTOs, page, totalPages, view);
-
- response.setContentType("text/xml; charset=utf-8");
- return ret;
- }
-
- /**
- * Returns an xml representation of the lesson grid for a course for gradebook
- *
- * This has two modes, learnerView and monitorView
- *
- * Learner view will get the data specific to one user
- *
- * Monitor will get the data average for whole lessons.
- */
- @SuppressWarnings("unchecked")
- @RequestMapping("/getCourseGridData")
- @ResponseBody
- public String getCourseGridData(HttpServletRequest request, HttpServletResponse response) throws Exception {
- // Getting the params passed in from the jqGrid
- int page = WebUtil.readIntParam(request, CommonConstants.PARAM_PAGE);
- int rowLimit = WebUtil.readIntParam(request, CommonConstants.PARAM_ROWS);
- String sortOrder = WebUtil.readStrParam(request, CommonConstants.PARAM_SORD);
- String sortBy = WebUtil.readStrParam(request, CommonConstants.PARAM_SIDX, true);
- Boolean isSearch = WebUtil.readBooleanParam(request, GradebookConstants.PARAM_SEARCH);
- String searchField = WebUtil.readStrParam(request, GradebookConstants.PARAM_SEARCH_FIELD, true);
- String searchOper = WebUtil.readStrParam(request, GradebookConstants.PARAM_SEARCH_OPERATION, true);
- String searchString = WebUtil.readStrParam(request, GradebookConstants.PARAM_SEARCH_STRING, true);
- GBGridView view = GradebookUtil.readGBGridViewParam(request, GradebookConstants.PARAM_VIEW, false);
- Integer courseID = WebUtil.readIntParam(request, AttributeNames.PARAM_ORGANISATION_ID);
- Organisation organisation = (Organisation) userManagementService.findById(Organisation.class, courseID);
-
- // in case of toolbar searching (which uses different parameters than a single field searching) get those
- // parameters
- if (isSearch && (searchField == null)) {
- searchField = GradebookConstants.PARAM_ROW_NAME;
- searchOper = GradebookConstants.SEARCH_CONTAINS;
- searchString = WebUtil.readStrParam(request, GradebookConstants.PARAM_ROW_NAME, true);
- }
-
- if (sortBy == null) {
- sortBy = GradebookConstants.PARAM_ID;
- }
-
- if (sortOrder == null) {
- sortOrder = GradebookConstants.SORT_ASC;
- }
-
- Set lessons = organisation.getLessons();
- if (lessons == null) {
- return null;
- }
-
- User user;
- User viewer = getRealUser();
- boolean isGroupManager = false;
- if (view == GBGridView.MON_USER) {
- Integer userID = WebUtil.readIntParam(request, GradebookConstants.PARAM_USERID);
- user = (User) userManagementService.findById(User.class, userID);
- } else {
- user = viewer;
- }
-
- //permission check
- if (view == GBGridView.MON_USER) {
- if (!securityService.isGroupMonitor(courseID, viewer.getUserId(), "get course gradebook", false)) {
- response.sendError(HttpServletResponse.SC_FORBIDDEN, "User is not a monitor in the organisation");
- return null;
- }
-
- } else if (view == GBGridView.MON_COURSE || view == GBGridView.LIST) {
- isGroupManager = userManagementService.hasRoleInOrganisation(viewer, Role.ROLE_GROUP_MANAGER, organisation);
- if (!isGroupManager && !securityService.hasOrgRole(courseID, viewer.getUserId(),
- new String[] { Role.MONITOR }, "get course gradebook", false)) {
- response.sendError(HttpServletResponse.SC_FORBIDDEN,
- "User is not a group manager or monitor in the organisation");
- return null;
- }
-
- } else if (view == GBGridView.LRN_COURSE) {
- if (!securityService.hasOrgRole(courseID, viewer.getUserId(), new String[] { Role.LEARNER },
- "get course gradebook for learner", false)) {
- response.sendError(HttpServletResponse.SC_FORBIDDEN, "User is not a learner in the organisation");
- return null;
- }
-
- } else {
- return null;
- }
-
- if ((organisation == null) || (user == null) || (viewer == null)) {
- // Grid will handle error, just log and return null
- logger.error("Error: request for course gradebook data with null course or user. CourseID: " + courseID);
- return null;
- }
- List gradebookLessonDTOs = gradebookService.getGBLessonRows(organisation, user, viewer,
- isGroupManager, view, page - 1, rowLimit, sortBy, sortOrder, searchString, getUser().getTimeZone());
-
- String ret;
- if (view == GBGridView.MON_COURSE || view == GBGridView.LIST) {
- int totalPages = new Double(
- Math.ceil(new Integer(lessons.size()).doubleValue() / new Integer(rowLimit).doubleValue()))
- .intValue();
- ret = GradebookUtil.toGridXML(gradebookLessonDTOs, page, totalPages, view);
-
- } else {
- ret = GradebookUtil.toGridXML(gradebookLessonDTOs, view, sortBy, isSearch, searchField, searchOper,
- searchString, sortOrder, rowLimit, page);
- }
-
- response.setContentType("text/xml; charset=utf-8");
- return ret;
- }
-
- /**
- * Gets the total mark for a user's lesson and writes the result in the response.
- */
- @RequestMapping("/getLessonMarkAggregate")
- @ResponseBody
- public String getLessonMarkAggregate(HttpServletRequest request, HttpServletResponse response) throws Exception {
- Long lessonID = WebUtil.readLongParam(request, AttributeNames.PARAM_LESSON_ID);
- Integer userID = WebUtil.readIntParam(request, GradebookConstants.PARAM_USERID);
-
- if (getUser().getUserID().equals(userID)) {
- if (!securityService.isLessonParticipant(lessonID, userID, "get lesson mark aggregate", false)) {
- response.sendError(HttpServletResponse.SC_FORBIDDEN, "User is not a participant in the lesson");
- return null;
- }
- } else {
- if (!securityService.isLessonMonitor(lessonID, getUser().getUserID(), "get lesson mark aggregate", false)) {
- response.sendError(HttpServletResponse.SC_FORBIDDEN, "User is not a monitor in the lesson");
- return null;
- }
- }
-
- Lesson lesson = lessonService.getLesson(lessonID);
- User learner = (User) userManagementService.findById(User.class, userID);
-
- if ((lesson != null) && (learner != null)) {
- GradebookUserLesson lessonMark = gradebookService.getGradebookUserLesson(lessonID, userID);
- if (lessonMark.getMark() != null) {
- response.setContentType("text/plain; charset=utf-8");
-
- return GradebookUtil.niceFormatting(lessonMark.getMark());
- }
- } else {
- // Grid will handle error, just log and return null
- logger.error("Error: request for course gradebook data with null user or lesson. lessonID: " + lessonID);
- }
- return null;
- }
-
- /**
- * Gets the average mark for an activity and writes the result in the response
- */
- @SuppressWarnings("unchecked")
- @RequestMapping("/getActivityMarkAverage")
- @ResponseBody
- public String getActivityMarkAverage(HttpServletRequest request, HttpServletResponse response) throws Exception {
- String rowID = WebUtil.readStrParam(request, AttributeNames.PARAM_ACTIVITY_ID);
-
- Long activityID = null;
- Long groupID = null;
-
- // Splitting the rowID param to get the activity/group id pair
- String[] split = rowID.split("_");
- if (split.length == 2) {
- activityID = Long.parseLong(split[0]);
- groupID = Long.parseLong(split[1]);
- } else {
- activityID = Long.parseLong(rowID);
- }
-
- Activity activity = gradebookService.getActivityById(activityID);
- if (activity == null) {
- logger.error("Activity with ID: " + activityID + " could not be found when getting activity mark average");
- response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Missing parameters");
- return null;
- }
- Integer userID = getUser().getUserID();
- for (Lesson lesson : activity.getLearningDesign().getLessons()) {
- if (!securityService.isLessonMonitor(lesson.getLessonId(), userID, "get activity mark average", false)) {
- response.sendError(HttpServletResponse.SC_FORBIDDEN, "User is not a monitor in the lesson");
- return null;
- }
- }
-
- Double averageMark = gradebookService.getAverageMarkForActivity(activityID, groupID);
- response.setContentType("text/plain, charset=utf-8");
- if (averageMark != null) {
- return GradebookUtil.niceFormatting(averageMark);
-
- } else {
- return GradebookConstants.CELL_EMPTY;
- }
- }
-
- /**
- * Gets the average mark for lesson and writes the result in the response
- */
- @RequestMapping("/getAverageMarkForLesson")
- @ResponseBody
- public String getAverageMarkForLesson(HttpServletRequest request, HttpServletResponse response) throws Exception {
- Long lessonID = WebUtil.readLongParam(request, AttributeNames.PARAM_LESSON_ID);
- if (!securityService.isLessonMonitor(lessonID, getUser().getUserID(), "get lesson mark average", false)) {
- response.sendError(HttpServletResponse.SC_FORBIDDEN, "User is not a monitor in the lesson");
- return null;
- }
-
- Double averageMark = gradebookService.getAverageMarkForLesson(lessonID);
-
- response.setContentType("text/plain; charset=utf-8");
- if (averageMark != null) {
- return GradebookUtil.niceFormatting(averageMark);
-
- } else {
- return GradebookConstants.CELL_EMPTY;
- }
- }
-
- private UserDTO getUser() {
- HttpSession ss = SessionManager.getSession();
- return (UserDTO) ss.getAttribute(AttributeNames.USER);
- }
-
- private User getRealUser() {
- UserDTO userDTO = getUser();
- if (userDTO != null) {
- return userManagementService.getUserByLogin(userDTO.getLogin());
- } else {
- return null;
- }
- }
-
+/****************************************************************
+ * Copyright (C) 2008 LAMS Foundation (http://lamsfoundation.org)
+ * =============================================================
+ * License Information: http://lamsfoundation.org/licensing/lams/2.0/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2.0
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * USA
+ *
+ * http://www.gnu.org/licenses/gpl.txt
+ * ****************************************************************
+ */
+
+package org.lamsfoundation.lams.gradebook.web.controller;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import org.apache.log4j.Logger;
+import org.lamsfoundation.lams.gradebook.GradebookUserLesson;
+import org.lamsfoundation.lams.gradebook.dto.GBLessonGridRowDTO;
+import org.lamsfoundation.lams.gradebook.dto.GBUserGridRowDTO;
+import org.lamsfoundation.lams.gradebook.dto.GradebookGridRowDTO;
+import org.lamsfoundation.lams.gradebook.service.IGradebookFullService;
+import org.lamsfoundation.lams.gradebook.util.GBGridView;
+import org.lamsfoundation.lams.gradebook.util.GradebookConstants;
+import org.lamsfoundation.lams.gradebook.util.GradebookUtil;
+import org.lamsfoundation.lams.learning.service.ILearnerService;
+import org.lamsfoundation.lams.learningdesign.Activity;
+import org.lamsfoundation.lams.learningdesign.Group;
+import org.lamsfoundation.lams.learningdesign.ToolActivity;
+import org.lamsfoundation.lams.learningdesign.dto.ActivityURL;
+import org.lamsfoundation.lams.lesson.Lesson;
+import org.lamsfoundation.lams.lesson.service.ILessonService;
+import org.lamsfoundation.lams.security.ISecurityService;
+import org.lamsfoundation.lams.usermanagement.Organisation;
+import org.lamsfoundation.lams.usermanagement.Role;
+import org.lamsfoundation.lams.usermanagement.User;
+import org.lamsfoundation.lams.usermanagement.dto.UserDTO;
+import org.lamsfoundation.lams.usermanagement.service.IUserManagementService;
+import org.lamsfoundation.lams.util.CommonConstants;
+import org.lamsfoundation.lams.util.Configuration;
+import org.lamsfoundation.lams.util.ConfigurationKeys;
+import org.lamsfoundation.lams.util.WebUtil;
+import org.lamsfoundation.lams.web.session.SessionManager;
+import org.lamsfoundation.lams.web.util.AttributeNames;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+/**
+ * Handles the general requests for content in gradebook
+ *
+ * @author lfoxton
+ */
+@Controller
+@RequestMapping("/gradebook")
+public class GradebookController {
+ private static Logger logger = Logger.getLogger(GradebookController.class);
+
+ @Autowired
+ private IGradebookFullService gradebookService;
+ @Autowired
+ private IUserManagementService userManagementService;
+ @Autowired
+ private ILessonService lessonService;
+ @Autowired
+ private ISecurityService securityService;
+ @Autowired
+ private ILearnerService learnerService;
+
+ @RequestMapping("")
+ @ResponseBody
+ public void unspecified() throws Exception {
+ }
+
+ /**
+ * Returns an xml representation of the activity grid for gradebook
+ *
+ * This has two modes, userView and activityView
+ *
+ * User view will get the grid data for a specified user, which is all their activity marks/outputs etc
+ *
+ * Activity view will get the grid data for all activities, without user info, instead there is an average mark for
+ * each activity.
+ */
+ @RequestMapping("/getActivityGridData")
+ @ResponseBody
+ public String getActivityGridData(HttpServletRequest request, HttpServletResponse response) throws Exception {
+ // Getting the params passed in from the jqGrid
+ int page = WebUtil.readIntParam(request, CommonConstants.PARAM_PAGE);
+ int rowLimit = WebUtil.readIntParam(request, CommonConstants.PARAM_ROWS);
+ String sortOrder = WebUtil.readStrParam(request, CommonConstants.PARAM_SORD);
+ String sortBy = WebUtil.readStrParam(request, CommonConstants.PARAM_SIDX, true);
+ Boolean isSearch = WebUtil.readBooleanParam(request, CommonConstants.PARAM_SEARCH);
+ String searchField = WebUtil.readStrParam(request, CommonConstants.PARAM_SEARCH_FIELD, true);
+ String searchOper = WebUtil.readStrParam(request, CommonConstants.PARAM_SEARCH_OPERATION, true);
+ String searchString = WebUtil.readStrParam(request, CommonConstants.PARAM_SEARCH_STRING, true);
+ GBGridView view = GradebookUtil.readGBGridViewParam(request, GradebookConstants.PARAM_VIEW, false);
+
+ Long lessonID = WebUtil.readLongParam(request, AttributeNames.PARAM_LESSON_ID);
+ if (!securityService.isLessonParticipant(lessonID, getUser().getUserID(), "get activity gradebook data",
+ false)) {
+ response.sendError(HttpServletResponse.SC_FORBIDDEN, "User is not a learner in the lesson");
+ return null;
+ }
+
+ // Getting userID param, it is passed differently from different views
+ UserDTO currentUserDTO = getUser();
+ Integer userID = null;
+ if (view == GBGridView.MON_USER) {
+ userID = WebUtil.readIntParam(request, GradebookConstants.PARAM_USERID);
+ } else if (view == GBGridView.LRN_ACTIVITY) {
+ if (currentUserDTO != null) {
+ userID = currentUserDTO.getUserID();
+ }
+ }
+
+ List gradebookActivityDTOs = new ArrayList<>();
+
+ // Get the user gradebook list from the db
+ // A slightly different list is needed for userview or activity view
+ if ((view == GBGridView.MON_USER) || (view == GBGridView.LRN_ACTIVITY)) {//2nd level && from personal marks page (2nd level or 1st)
+ gradebookActivityDTOs = gradebookService.getGBActivityRowsForLearner(lessonID, userID,
+ currentUserDTO.getTimeZone());
+ } else if (view == GBGridView.MON_ACTIVITY) {
+ gradebookActivityDTOs = gradebookService.getGBActivityRowsForLesson(lessonID, currentUserDTO.getTimeZone(),
+ true);
+ }
+
+ if ((sortBy == null) || sortBy.equals("")) {
+ sortBy = GradebookConstants.PARAM_START_DATE;
+ }
+
+ String ret = GradebookUtil.toGridXML(gradebookActivityDTOs, view, sortBy, isSearch, searchField, searchOper,
+ searchString, sortOrder, rowLimit, page);
+
+ response.setContentType("text/xml; charset=utf-8");
+ return ret;
+ }
+
+ @RequestMapping("/getActivityArchiveGridData")
+ @ResponseBody
+ public String getActivityArchiveGridData(HttpServletRequest request, HttpServletResponse response)
+ throws Exception {
+ GBGridView view = GradebookUtil.readGBGridViewParam(request, GradebookConstants.PARAM_VIEW, false);
+
+ Long lessonID = WebUtil.readLongParam(request, AttributeNames.PARAM_LESSON_ID);
+ Long activityID = WebUtil.readLongParam(request, AttributeNames.PARAM_ACTIVITY_ID);
+ if (!securityService.isLessonParticipant(lessonID, getUser().getUserID(), "get activity archive gradebook data",
+ false)) {
+ response.sendError(HttpServletResponse.SC_FORBIDDEN, "User is not a learner in the lesson");
+ return null;
+ }
+
+ // Getting userID param, it is passed differently from different views
+ UserDTO currentUserDTO = getUser();
+ Integer userID = null;
+ if (view == GBGridView.MON_USER || view == GBGridView.MON_ACTIVITY) {
+ userID = WebUtil.readIntParam(request, GradebookConstants.PARAM_USERID);
+ } else if (view == GBGridView.LRN_ACTIVITY) {
+ if (currentUserDTO != null) {
+ userID = currentUserDTO.getUserID();
+ }
+ }
+
+ List gradebookActivityDTOs = new ArrayList<>();
+
+ // Get the user gradebook list from the db
+ // A slightly different list is needed for userview or activity view
+ if ((view == GBGridView.MON_USER) || (view == GBGridView.LRN_ACTIVITY) || (view == GBGridView.MON_ACTIVITY)) {//2nd level && from personal marks page (2nd level or 1st)
+ gradebookActivityDTOs = gradebookService.getGBActivityArchiveRowsForLearner(activityID, userID,
+ currentUserDTO.getTimeZone());
+ }
+
+ String ret = GradebookUtil.toGridXML(gradebookActivityDTOs, view, GradebookConstants.PARAM_ID, false, null,
+ null, null, GradebookConstants.SORT_DESC, 100, 1);
+
+ response.setContentType("text/xml; charset=utf-8");
+ return ret;
+ }
+
+ @SuppressWarnings("unchecked")
+ @RequestMapping("/getLessonCompleteGridData")
+ @ResponseBody
+ public String getLessonCompleteGridData(HttpServletRequest request, HttpServletResponse response) throws Exception {
+ // Getting the params passed in from the jqGrid
+ Long lessonId = WebUtil.readLongParam(request, AttributeNames.PARAM_LESSON_ID);
+ UserDTO currentUserDTO = getUser();
+ Integer userId = currentUserDTO.getUserID();
+ if (!securityService.isLessonParticipant(lessonId, userId, "get lesson complete gradebook data", false)) {
+ response.sendError(HttpServletResponse.SC_FORBIDDEN, "User is not a learner in the lesson");
+ }
+
+ List gradebookActivityDTOs = gradebookService.getGBLessonComplete(lessonId, userId);
+
+ ObjectNode resultJSON = JsonNodeFactory.instance.objectNode();
+ resultJSON.put(CommonConstants.ELEMENT_RECORDS, gradebookActivityDTOs.size());
+
+ ArrayNode rowsJSON = JsonNodeFactory.instance.arrayNode();
+ for (GradebookGridRowDTO gradebookActivityDTO : gradebookActivityDTOs) {
+ ObjectNode rowJSON = JsonNodeFactory.instance.objectNode();
+ String id = gradebookActivityDTO.getId();
+ String[] idParts = id.split("_");
+ if (idParts.length > 1) {
+ // if activity is grouped, use just the real activity ID and leave out group ID
+ // as we know there will be no ID clash in this single learner gradebook table
+ id = idParts[0];
+ }
+ rowJSON.put(GradebookConstants.ELEMENT_ID, id);
+
+ ArrayNode cellJSON = JsonNodeFactory.instance.arrayNode();
+ cellJSON.add(gradebookActivityDTO.getRowName());
+ cellJSON.add(gradebookActivityDTO.getStatus());
+ cellJSON.add(gradebookActivityDTO.getAverageMark() == null ? GradebookConstants.CELL_EMPTY
+ : GradebookUtil.niceFormatting(gradebookActivityDTO.getAverageMark()));
+ cellJSON.add(gradebookActivityDTO.getMark() == null ? GradebookConstants.CELL_EMPTY
+ : GradebookUtil.niceFormatting(gradebookActivityDTO.getMark()));
+
+ rowJSON.set(CommonConstants.ELEMENT_CELL, cellJSON);
+ rowsJSON.add(rowJSON);
+ }
+ resultJSON.set(CommonConstants.ELEMENT_ROWS, rowsJSON);
+
+ // make a mapping of activity ID -> URL, same as in progress bar
+ ObjectNode activityURLJSON = JsonNodeFactory.instance.objectNode();
+ Object[] ret = learnerService.getStructuredActivityURLs(userId, lessonId);
+ for (ActivityURL activity : (List) ret[0]) {
+ String url = activity.getUrl();
+ if (url != null) {
+ if (url.startsWith("learner.do")) {
+ url = "learning/" + url;
+ }
+ String serverUrl = Configuration.get(ConfigurationKeys.SERVER_URL);
+ if (!url.startsWith(serverUrl)) {
+ // monitor mode URLs should be prepended with server URL
+ url = serverUrl + url;
+ }
+ activityURLJSON.put(activity.getActivityId().toString(), activity.getUrl());
+ }
+ }
+ resultJSON.set("urls", activityURLJSON);
+
+ boolean isWeighted = gradebookService.isWeightedMarks(lessonId);
+ GradebookUserLesson gradebookUserLesson = gradebookService.getGradebookUserLesson(lessonId, userId);
+ resultJSON.put("learnerLessonMark",
+ gradebookUserLesson == null || gradebookUserLesson.getMark() == null ? GradebookConstants.CELL_EMPTY
+ : GradebookUtil.niceFormatting(gradebookUserLesson.getMark(), isWeighted));
+ Double averageLessonMark = gradebookService.getAverageMarkForLesson(lessonId);
+ resultJSON.put("averageLessonMark", averageLessonMark == null ? GradebookConstants.CELL_EMPTY
+ : GradebookUtil.niceFormatting(averageLessonMark, isWeighted));
+
+ response.setContentType("application/json;charset=utf-8");
+ return resultJSON.toString();
+ }
+
+ /**
+ * Returns an xml representation of the user grid for gradebook
+ *
+ * This has three modes: userView, activityView and courseMonitorView
+ *
+ * User view will get all the learners in a lesson and print their gradebook data with their mark for the entire
+ * lesson
+ *
+ * Activity view will take an extra parameter (activityID) and instead show the user's mark just for one activity
+ *
+ * Course monitor view gets the same as the user view, but the link is set to the lesson level gradebook instead of
+ * learner.
+ */
+ @RequestMapping("/getUserGridData")
+ @ResponseBody
+ public String getUserGridData(HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ // Getting the params passed in from the jqGrid
+ int page = WebUtil.readIntParam(request, CommonConstants.PARAM_PAGE);
+ int rowLimit = WebUtil.readIntParam(request, CommonConstants.PARAM_ROWS);
+ String sortOrder = WebUtil.readStrParam(request, CommonConstants.PARAM_SORD);
+ String sortBy = WebUtil.readStrParam(request, CommonConstants.PARAM_SIDX, true);
+ Boolean isSearch = WebUtil.readBooleanParam(request, CommonConstants.PARAM_SEARCH);
+ String searchField = WebUtil.readStrParam(request, CommonConstants.PARAM_SEARCH_FIELD, true);
+ String searchString = WebUtil.readStrParam(request, CommonConstants.PARAM_SEARCH_STRING, true);
+ GBGridView view = GradebookUtil.readGBGridViewParam(request, GradebookConstants.PARAM_VIEW, false);
+ Long lessonID = WebUtil.readLongParam(request, AttributeNames.PARAM_LESSON_ID, true);
+ Integer organisationID = WebUtil.readIntParam(request, AttributeNames.PARAM_ORGANISATION_ID, true);
+ UserDTO user = getUser();
+
+ // in case of toolbar searching (which uses different parameters than a single field searching) get those
+ // parameters
+ if (isSearch && (searchField == null)) {
+ searchField = GradebookConstants.PARAM_ROW_NAME;
+ searchString = WebUtil.readStrParam(request, GradebookConstants.PARAM_ROW_NAME, true);
+ }
+
+ // Get the user gradebook list from the db
+ List gradebookUserDTOs = new ArrayList<>();
+
+ int totalUsers = 0;
+ // if leesonID is specified show results based on lesson
+ if (lessonID != null) {
+ if (!securityService.isLessonMonitor(lessonID, user.getUserID(), "get gradebook", false)) {
+ response.sendError(HttpServletResponse.SC_FORBIDDEN, "User is not a monitor in the lesson");
+ return null;
+ }
+
+ Lesson lesson = lessonService.getLesson(lessonID);
+ //GBGridView.MON_USER - 1st table of gradebook lesson monitor
+ //GBGridView.MON_COURSE - Subgrid of 1st table of gradebook course monitor
+ if (view == GBGridView.MON_USER || view == GBGridView.MON_COURSE) {
+ gradebookUserDTOs = gradebookService.getGBUserRowsForLesson(lesson, page - 1, rowLimit, sortBy,
+ sortOrder, searchString, user.getTimeZone());
+ totalUsers = lesson.getAllLearners().size();
+
+ // Subgrid of 2nd table of gradebook lesson monitor
+ } else if (view == GBGridView.MON_ACTIVITY) {
+ String rowID = WebUtil.readStrParam(request, AttributeNames.PARAM_ACTIVITY_ID);
+
+ Long activityID = null;
+
+ // Splitting the rowID param to get the activity/group id pair
+ String[] split = rowID.split("_");
+ if (split.length == 2) {
+ activityID = Long.parseLong(split[0]);
+ } else {
+ activityID = Long.parseLong(rowID);
+ }
+
+ // Getting the group id if it is there
+ Long groupId = WebUtil.readLongParam(request, GradebookConstants.PARAM_GROUP_ID, true);
+
+ Activity activity = gradebookService.getActivityById(activityID);
+ if ((activity != null) && (activity instanceof ToolActivity)) {
+ gradebookUserDTOs = gradebookService.getGBUserRowsForActivity(lesson, (ToolActivity) activity,
+ groupId, page - 1, rowLimit, sortBy, sortOrder, searchString, user.getTimeZone());
+
+ //calculate totalUsers
+ totalUsers = lesson.getAllLearners().size();
+ if (groupId != null) {
+ Group group = (Group) userManagementService.findById(Group.class, groupId);
+ if (group != null) {
+ totalUsers = group.getUsers().size();
+ }
+ }
+
+ } else {
+ // return null and the grid will report an error
+ logger.error("No activity found for: " + activityID);
+ return null;
+ }
+ }
+
+ // 2nd table of gradebook course monitor
+ // if organisationID is specified (but not lessonID) then show results for organisation
+ } else if (organisationID != null) {
+ if (!securityService.isGroupMonitor(organisationID, user.getUserID(), "get gradebook", false)) {
+ response.sendError(HttpServletResponse.SC_FORBIDDEN, "User is not a monitor in the organisation");
+ return null;
+ }
+
+ Organisation org = (Organisation) userManagementService.findById(Organisation.class, organisationID);
+ gradebookUserDTOs = gradebookService.getGBUserRowsForOrganisation(org, page - 1, rowLimit, sortOrder,
+ searchString);
+ totalUsers = gradebookService.getCountUsersByOrganisation(organisationID, searchString);
+
+ } else {
+ logger.error("Missing parameters: either lessonID or organisationID should be specified.");
+ response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Missing parameters");
+ return null;
+ }
+
+ //calculate totalPages
+ int totalPages = new Double(
+ Math.ceil(new Integer(totalUsers).doubleValue() / new Integer(rowLimit).doubleValue())).intValue();
+ String ret = GradebookUtil.toGridXML(gradebookUserDTOs, page, totalPages, view);
+
+ response.setContentType("text/xml; charset=utf-8");
+ return ret;
+ }
+
+ /**
+ * Returns an xml representation of the lesson grid for a course for gradebook
+ *
+ * This has two modes, learnerView and monitorView
+ *
+ * Learner view will get the data specific to one user
+ *
+ * Monitor will get the data average for whole lessons.
+ */
+ @SuppressWarnings("unchecked")
+ @RequestMapping("/getCourseGridData")
+ @ResponseBody
+ public String getCourseGridData(HttpServletRequest request, HttpServletResponse response) throws Exception {
+ // Getting the params passed in from the jqGrid
+ int page = WebUtil.readIntParam(request, CommonConstants.PARAM_PAGE);
+ int rowLimit = WebUtil.readIntParam(request, CommonConstants.PARAM_ROWS);
+ String sortOrder = WebUtil.readStrParam(request, CommonConstants.PARAM_SORD);
+ String sortBy = WebUtil.readStrParam(request, CommonConstants.PARAM_SIDX, true);
+ Boolean isSearch = WebUtil.readBooleanParam(request, CommonConstants.PARAM_SEARCH);
+ String searchField = WebUtil.readStrParam(request, CommonConstants.PARAM_SEARCH_FIELD, true);
+ String searchOper = WebUtil.readStrParam(request, CommonConstants.PARAM_SEARCH_OPERATION, true);
+ String searchString = WebUtil.readStrParam(request, CommonConstants.PARAM_SEARCH_STRING, true);
+ GBGridView view = GradebookUtil.readGBGridViewParam(request, GradebookConstants.PARAM_VIEW, false);
+ Integer courseID = WebUtil.readIntParam(request, AttributeNames.PARAM_ORGANISATION_ID);
+ Organisation organisation = (Organisation) userManagementService.findById(Organisation.class, courseID);
+
+ // in case of toolbar searching (which uses different parameters than a single field searching) get those
+ // parameters
+ if (isSearch && (searchField == null)) {
+ searchField = GradebookConstants.PARAM_ROW_NAME;
+ searchOper = GradebookConstants.SEARCH_CONTAINS;
+ searchString = WebUtil.readStrParam(request, GradebookConstants.PARAM_ROW_NAME, true);
+ }
+
+ if (sortBy == null) {
+ sortBy = GradebookConstants.PARAM_ID;
+ }
+
+ if (sortOrder == null) {
+ sortOrder = GradebookConstants.SORT_ASC;
+ }
+
+ Set lessons = organisation.getLessons();
+ if (lessons == null) {
+ return null;
+ }
+
+ User user;
+ User viewer = getRealUser();
+ boolean isGroupManager = false;
+ if (view == GBGridView.MON_USER) {
+ Integer userID = WebUtil.readIntParam(request, GradebookConstants.PARAM_USERID);
+ user = (User) userManagementService.findById(User.class, userID);
+ } else {
+ user = viewer;
+ }
+
+ //permission check
+ if (view == GBGridView.MON_USER) {
+ if (!securityService.isGroupMonitor(courseID, viewer.getUserId(), "get course gradebook", false)) {
+ response.sendError(HttpServletResponse.SC_FORBIDDEN, "User is not a monitor in the organisation");
+ return null;
+ }
+
+ } else if (view == GBGridView.MON_COURSE || view == GBGridView.LIST) {
+ isGroupManager = userManagementService.hasRoleInOrganisation(viewer, Role.ROLE_GROUP_MANAGER, organisation);
+ if (!isGroupManager && !securityService.hasOrgRole(courseID, viewer.getUserId(),
+ new String[] { Role.MONITOR }, "get course gradebook", false)) {
+ response.sendError(HttpServletResponse.SC_FORBIDDEN,
+ "User is not a group manager or monitor in the organisation");
+ return null;
+ }
+
+ } else if (view == GBGridView.LRN_COURSE) {
+ if (!securityService.hasOrgRole(courseID, viewer.getUserId(), new String[] { Role.LEARNER },
+ "get course gradebook for learner", false)) {
+ response.sendError(HttpServletResponse.SC_FORBIDDEN, "User is not a learner in the organisation");
+ return null;
+ }
+
+ } else {
+ return null;
+ }
+
+ if ((organisation == null) || (user == null) || (viewer == null)) {
+ // Grid will handle error, just log and return null
+ logger.error("Error: request for course gradebook data with null course or user. CourseID: " + courseID);
+ return null;
+ }
+ List gradebookLessonDTOs = gradebookService.getGBLessonRows(organisation, user, viewer,
+ isGroupManager, view, page - 1, rowLimit, sortBy, sortOrder, searchString, getUser().getTimeZone());
+
+ String ret;
+ if (view == GBGridView.MON_COURSE || view == GBGridView.LIST) {
+ int totalPages = new Double(
+ Math.ceil(new Integer(lessons.size()).doubleValue() / new Integer(rowLimit).doubleValue()))
+ .intValue();
+ ret = GradebookUtil.toGridXML(gradebookLessonDTOs, page, totalPages, view);
+
+ } else {
+ ret = GradebookUtil.toGridXML(gradebookLessonDTOs, view, sortBy, isSearch, searchField, searchOper,
+ searchString, sortOrder, rowLimit, page);
+ }
+
+ response.setContentType("text/xml; charset=utf-8");
+ return ret;
+ }
+
+ /**
+ * Gets the total mark for a user's lesson and writes the result in the response.
+ */
+ @RequestMapping("/getLessonMarkAggregate")
+ @ResponseBody
+ public String getLessonMarkAggregate(HttpServletRequest request, HttpServletResponse response) throws Exception {
+ Long lessonID = WebUtil.readLongParam(request, AttributeNames.PARAM_LESSON_ID);
+ Integer userID = WebUtil.readIntParam(request, GradebookConstants.PARAM_USERID);
+
+ if (getUser().getUserID().equals(userID)) {
+ if (!securityService.isLessonParticipant(lessonID, userID, "get lesson mark aggregate", false)) {
+ response.sendError(HttpServletResponse.SC_FORBIDDEN, "User is not a participant in the lesson");
+ return null;
+ }
+ } else {
+ if (!securityService.isLessonMonitor(lessonID, getUser().getUserID(), "get lesson mark aggregate", false)) {
+ response.sendError(HttpServletResponse.SC_FORBIDDEN, "User is not a monitor in the lesson");
+ return null;
+ }
+ }
+
+ Lesson lesson = lessonService.getLesson(lessonID);
+ User learner = (User) userManagementService.findById(User.class, userID);
+
+ if ((lesson != null) && (learner != null)) {
+ GradebookUserLesson lessonMark = gradebookService.getGradebookUserLesson(lessonID, userID);
+ if (lessonMark.getMark() != null) {
+ response.setContentType("text/plain; charset=utf-8");
+
+ return GradebookUtil.niceFormatting(lessonMark.getMark());
+ }
+ } else {
+ // Grid will handle error, just log and return null
+ logger.error("Error: request for course gradebook data with null user or lesson. lessonID: " + lessonID);
+ }
+ return null;
+ }
+
+ /**
+ * Gets the average mark for an activity and writes the result in the response
+ */
+ @SuppressWarnings("unchecked")
+ @RequestMapping("/getActivityMarkAverage")
+ @ResponseBody
+ public String getActivityMarkAverage(HttpServletRequest request, HttpServletResponse response) throws Exception {
+ String rowID = WebUtil.readStrParam(request, AttributeNames.PARAM_ACTIVITY_ID);
+
+ Long activityID = null;
+ Long groupID = null;
+
+ // Splitting the rowID param to get the activity/group id pair
+ String[] split = rowID.split("_");
+ if (split.length == 2) {
+ activityID = Long.parseLong(split[0]);
+ groupID = Long.parseLong(split[1]);
+ } else {
+ activityID = Long.parseLong(rowID);
+ }
+
+ Activity activity = gradebookService.getActivityById(activityID);
+ if (activity == null) {
+ logger.error("Activity with ID: " + activityID + " could not be found when getting activity mark average");
+ response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Missing parameters");
+ return null;
+ }
+ Integer userID = getUser().getUserID();
+ for (Lesson lesson : activity.getLearningDesign().getLessons()) {
+ if (!securityService.isLessonMonitor(lesson.getLessonId(), userID, "get activity mark average", false)) {
+ response.sendError(HttpServletResponse.SC_FORBIDDEN, "User is not a monitor in the lesson");
+ return null;
+ }
+ }
+
+ Double averageMark = gradebookService.getAverageMarkForActivity(activityID, groupID);
+ response.setContentType("text/plain, charset=utf-8");
+ if (averageMark != null) {
+ return GradebookUtil.niceFormatting(averageMark);
+
+ } else {
+ return GradebookConstants.CELL_EMPTY;
+ }
+ }
+
+ /**
+ * Gets the average mark for lesson and writes the result in the response
+ */
+ @RequestMapping("/getAverageMarkForLesson")
+ @ResponseBody
+ public String getAverageMarkForLesson(HttpServletRequest request, HttpServletResponse response) throws Exception {
+ Long lessonID = WebUtil.readLongParam(request, AttributeNames.PARAM_LESSON_ID);
+ if (!securityService.isLessonMonitor(lessonID, getUser().getUserID(), "get lesson mark average", false)) {
+ response.sendError(HttpServletResponse.SC_FORBIDDEN, "User is not a monitor in the lesson");
+ return null;
+ }
+
+ Double averageMark = gradebookService.getAverageMarkForLesson(lessonID);
+
+ response.setContentType("text/plain; charset=utf-8");
+ if (averageMark != null) {
+ return GradebookUtil.niceFormatting(averageMark);
+
+ } else {
+ return GradebookConstants.CELL_EMPTY;
+ }
+ }
+
+ private UserDTO getUser() {
+ HttpSession ss = SessionManager.getSession();
+ return (UserDTO) ss.getAttribute(AttributeNames.USER);
+ }
+
+ private User getRealUser() {
+ UserDTO userDTO = getUser();
+ if (userDTO != null) {
+ return userManagementService.getUserByLogin(userDTO.getLogin());
+ } else {
+ return null;
+ }
+ }
+
}
\ No newline at end of file
Index: lams_tool_assessment/conf/language/lams/ApplicationResources.properties
===================================================================
diff -u -r9f956c8c8c000f50ae584b8feffdab3ed0c709d5 -r394f403c289f0fd7808c228840bead5c4e7d5d32
--- lams_tool_assessment/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 9f956c8c8c000f50ae584b8feffdab3ed0c709d5)
+++ lams_tool_assessment/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 394f403c289f0fd7808c228840bead5c4e7d5d32)
@@ -1,354 +1,358 @@
-appName = assessment
-#language code: en
-#locale code: AU
-
- # Exported from the LAMS Community by Ernie Ghiglione on Fri Apr 05 03:05:53 CST 2019
-
-#=================== labels for Assessment =================#
-
-appName =Assessment Tool
-activity.description =Tool for assessing learners
-activity.helptext =Create questions to assess learners.
-tool.display.name =Assessment Tool
-tool.description =Tool for assessing learners.
-label.authoring.heading =Assessment Authoring
-label.author.title =Assessment
-label.authoring.heading.basic =Basic
-label.authoring.heading.basic.desc =Basic input information for assessment tool
-label.authoring.heading.advance.desc =Please input advance options for assessment tool
-label.authoring.basic.title =Title
-label.authoring.basic.question.name =Question name
-label.authoring.basic.question.text =Question text
-label.authoring.basic.default.question.grade =Default question grade
-label.authoring.basic.penalty.factor =Penalty factor
-label.authoring.basic.general.feedback =General feedback
-label.authoring.basic.shuffle.the.choices =Shuffle answers?
-label.authoring.basic.add.question =Add question
-label.authoring.basic.question.list.title =Question list
-label.authoring.basic.list.header.type =Type
-label.authoring.basic.list.header.question =Question
-label.authoring.basic.type.multiple.choice =Multiple choice
-label.authoring.basic.type.matching.pairs =Matching pairs
-label.authoring.basic.type.short.answer =Short answer
-label.authoring.basic.type.numerical =Numerical
-label.authoring.basic.type.true.false =True/False
-label.authoring.basic.type.essay =Essay
-label.authoring.basic.type.ordering =Ordering
-label.authoring.basic.edit =Edit
-label.authoring.basic.delete =Delete
-label.authoring.basic.down =Move down
-label.authoring.basic.up =Move Up
-label.authoring.basic.option.answer =Answer
-label.authoring.basic.option.question =Question
-label.authoring.basic.option.grade =Grade
-label.authoring.basic.option.feedback =Feedback
-label.authoring.basic.option.accepted.error =Accepted error
-label.authoring.basic.unit.unit =Unit
-label.authoring.basic.unit.multiplier =Multiplier
-label.authoring.basic.none =None
-label.authoring.choice.add.multiple.choice =Add multiple choice
-label.authoring.choice.field.required =This field is required.
-label.authoring.choice.enter.integer =Please enter an integer.
-label.authoring.choice.enter.float =Please enter a floating point number.
-label.authoring.choice.one.multiple.answers =One or multiple answers?
-label.authoring.choice.one.answer =One answer only
-label.authoring.choice.multiple.answers =Multiple answers allowed
-label.authoring.choice.overall.feedback =Overall feedback
-label.authoring.choice.feedback.on.correct =For any correct response
-label.authoring.choice.feedback.on.partially.correct =For any partially correct response
-label.authoring.choice.feedback.on.incorrect =For any incorrect response
-label.authoring.choice.add.option =Add another answer
-label.authoring.matching.pairs.add.matching.pairs =Add question
-label.authoring.matching.pairs.matching.pairs =Matching pairs
-label.authoring.matching.pairs.error.one.matching.pair =You should provide at least 1 matching pair.
-label.authoring.matching.pairs.add.matching.pair =Add another
-label.authoring.short.answer.no.case.unimportant =No, case is unimportant
-label.authoring.short.answer.yes.case.must.match =Yes, case must match
-label.authoring.short.answer.case.sensitivity =Case sensitivity
-label.authoring.short.answer.answers =Answers
-label.authoring.short.answer.add.answer =Add another answer
-label.authoring.short.answer.add.short.answer =Add question
-label.authoring.true.false.question =True/False question
-label.authoring.true.false.correct.answer =Correct answer
-label.authoring.true.false.false =False
-label.authoring.true.false.true =True
-label.authoring.true.false.feedback.on.true =Feedback for the response 'True'.
-label.authoring.true.false.feedback.on.false =Feedback for the response 'False'.
-label.authoring.true.false.add.true.false =Add question
-label.authoring.numerical.question =Numerical question
-label.authoring.numerical.answers =Answers
-label.authoring.numerical.units =Units
-label.authoring.numerical.error.answer =You should provide at least one possible answer.
-label.authoring.numerical.add.answer =Add another answer
-label.authoring.numerical.add.numerical =Add question
-label.authoring.numerical.add.unit =Add another unit
-label.authoring.essay.add.essay =Add question
-label.authoring.ordering.add.ordering =Add question
-label.authoring.advance.allow.students.overall.feedback =Display overall feedback at the end of each attempt
-label.authoring.advance.time.limit =Time limit (minutes)
-label.authoring.advance.questions.per.page =Questions per page
-label.authoring.advance.all.in.one.page =All in one page
-label.authoring.advance.shuffle.questions =Shuffle questions
-label.authoring.advance.attempts.allowed =Attempts allowed
-label.authoring.advance.unlimited =Unlimited
-label.authoring.advance.allow.students.question.feedback =Allow learners to see question feedback after each question
-label.authoring.advance.allow.students.right.wrong.answers =Allow learners to see right/wrong answers
-label.authoring.advance.allow.students.grades =Allow learners to see grades at the end of each attempt
-label.authoring.advance.allow.students.history.responses =Allow learners to see history of responses at the end of each attempt
-label.authoring.advance.overall.feedback =Overall feedback
-label.authoring.advance.grade.boundary =Grade boundary
-label.authoring.advance.feedback =Feedback
-label.authoring.advance.add.feedback.field =Add feedback
-label.authoring.cancel.button =Cancel
-label.authoring.basic.answer.options =Answer options
-label.authoring.basic.instruction =Instructions
-error.default.grade.wrong.format =Default question grade should be of numeric format
-error.penalty.factor.wrong.format =Penalty factor should be of float format
-error.question.name.blank =Question name can not be blank.
-error.question.text.blank =Question text can not be blank.
-error.msg.default.content.not.find =Could not retrieve default content record for this tool.
-error.monitoring.export.excel =Export assessment report failed because of this reason: {0}
-authoring.msg.cancel.save =Do you want to close this window without saving?
-authoring.msg.one.question.to.be.saved =There must be at least one question to be saved.
-label.learning.page =Page:
-label.learning.title =Assessment
-label.learning.choose.one.answer =Choose one of the following answers.
-label.learning.choose.at.least.one.answer =Choose at least one answer.
-label.learning.matching.pairs.pick.up =Pick up the corresponding answers
-label.learning.matching.pairs.choose =Choose
-label.learning.short.answer.answer =Answer:
-label.learning.true.false.true =True
-label.learning.true.false.false =False
-label.learning.ordering.sort.answers =Sort answers in the right order (click on the answers to drag-and-drop in order).
-label.learning.marks =Marks for this submission: {0}/{1}.
-label.learning.penalty =This submission attracted a penalty of {0}.
-label.learning.finish.test =Finish
-label.learning.submit.all =Submit all
-label.learning.next.activity =Next Activity
-label.learning.resubmit =Resubmit
-label.learning.summary.started.on =Started on
-label.learning.summary.completed.on =Completed on
-label.learning.summary.time.taken =Time taken (minutes)
-label.learning.summary.hours =hour(s)
-label.learning.summary.minutes =minutes
-label.learning.summary.grade =Grade
-label.learning.summary.out.of.maximum =out of a maximum of
-label.learning.summary.feedback =Feedback
-label.learning.question.summary.history.responces =History of responses:
-label.learning.question.summary.response =Response
-label.learning.question.summary.grade =Grade
-label.learning.countdown.time.left =Time left
-label.learning.blockui.time.is.over =Time is over. Processing your answers...
-label.learning.blockui.are.you.ready =You are going to participate in activity that has time limitation. Are you ready to start?
-monitoring.tab.summary =Summary
-monitoring.tab.statistics =Stats
-monitoring.tab.edit.activity =Edit Activity
-monitoring.label.group =Group
-monitoring.label.user.name =Name
-label.monitoring.edit.activity.edit =Edit
-label.monitoring.summary.summary =Summary
-label.monitoring.summary.double.click =Double click on learner's name to get full individual report.
-label.monitoring.summary.report.by.question =Report by question
-label.monitoring.summary.export.summary =Export summary
-label.monitoring.summary.results.question =Detailed question results
-label.monitoring.summary.choose =Choose...
-label.monitoring.summary.user.name =Name
-label.monitoring.summary.total =Total
-label.monitoring.summary.learner.summary =Learner summary
-label.monitoring.user.summary.history.responses =History of responses
-label.monitoring.user.summary.user.name =Username
-label.monitoring.user.summary.number.attempts =Number of attempts
-label.monitoring.user.summary.time.last.attempt =Time in the last attempt
-label.monitoring.user.summary.last.attempt.grade =Last attempt grade
-label.monitoring.user.summary.attempt =Attempt
-label.monitoring.user.summary.time =Time
-label.monitoring.user.summary.response =Response
-label.monitoring.user.summary.grade =Grade
-label.monitoring.user.summary.title =Title:
-label.monitoring.user.summary.question =Question:
-label.monitoring.user.summary.ok =Ok
-label.monitoring.question.summary.history.responses =Responses for the question
-label.monitoring.question.summary.title =Title
-label.monitoring.question.summary.question =Question
-label.monitoring.question.summary.default.mark =Default mark
-label.monitoring.question.summary.penalty =Penalty
-label.monitoring.question.summary.average.mark =Average mark
-label.monitoring.question.summary.group =Group:
-label.monitoring.question.summary.ok =Ok
-output.desc.learner.total.score =Last total score
-output.desc.learner.time.taken =Time taken
-output.desc.learner.number.of.attempts =Number of attempts
-output.user.score.for.question =Score for the question:
-error.form.validation.error =You have 1 error in a form. It has been highlighted
-error.form.validation.errors =You have {0} errors in a form. They have been highlighted
-error.form.validation.hundred.score =One of the answers should have a grade of 100% so it is possible to get full marks for this question.
-error.form.validation.positive.accepted.errors =All the accepted errors should be positive.
-message.monitoring.summary.no.session =No learners yet
-label.cancel =Cancel
-define.later.message =Please wait for the instructor to complete the contents of this activity.
-button.try.again =Try again
-activity.title =Assessment
-label.authoring.save.button =Save
-label.authoring.heading.advance =Advanced
-label.down =Move down
-label.finished =Next Activity
-label.finish =Finished
-label.on =On
-label.off =Off
-monitor.summary.th.advancedSettings =Advanced settings
-label.authoring.advanced.notify.on.attempt.completion =Notify instructor when learner completes attempt
-event.learner.completes.attempt.subject =LAMS: Learner completed attempt in Assessment tool
-event.learner.completes.attempt.body =The learner {0} completed attempt in Assessment tool.\n\nThis message was send automatically, following tool''''s advanced settings.
-message.alertContentEdit =Note: One or more learners have accessed this activity and it cannot longer be modified.
-warning.msg.authoring.do.you.want.to.delete =Do you really want to delete this question?
-label.export.exported.on =Exported on:
-label.export.question.summary =Question summary
-label.export.user.summary =Learner summary
-label.export.date.attempted =Date attempted
-label.export.mark =Mark
-label.export.time.taken =Time taken from activity start (seconds)
-label.export.average =Average
-label.export.summary.by.user =Summary by learner
-lable.export.summary.by.question =Summary by question
-label.export.user.id =Username
-label.authoring.basic.allow.learners.rich.editor =Allow learners to use rich text editor
-label.authoring.advance.allow.students.right.answers =Indicate choice(s) that have been answered correctly.
-label.authoring.advance.allow.students.wrong.answers =Indicate choice(s) that have been answered incorrectly.
-monitor.summary.date.restriction =Deadline
-monitor.summary.when.date.restriction.is.set =Learners will not be able to take this assessment after the set date and time.
-monitor.summary.after.date =Date/time:
-monitor.summary.set.restriction =Set restriction
-monitor.summary.unset.restriction =Remove restriction
-authoring.info.teacher.set.restriction =For this activity, the instructor fixed a deadline until {0}. After this time this activity will not be available.
-monitor.summary.notification =Notification
-monitor.summary.date.restriction.set =Deadline has been set
-monitor.summary.date.restriction.removed =Deadline has been removed
-label.authoring.advance.passing.mark =Assessment passing mark
-label.authoring.advance.choose.restriction =Choose restriction:
-label.authoring.advance.passing.mark.none =None
-label.learning.havent.reached.passing.mark =Sorry, you haven''t scored {0} required to pass the activity. Please, try one more time.
-label.authoring.basic.add.question.to.pool =Add question
-label.authoring.basic.add.question.to.list =Add question to list
-label.authoring.basic.question.bank.title =Question bank
-label.authoring.basic.list.header.mark =Mark
-label.authoring.basic.type.random.question =Random question
-label.authoring.basic.select.random.question =Random question from pool
-label.authoring.basic.random.question =Question
-label.authoring.basic.warning.too.many.questions =Too many questions in a list. Please, remove some of them.
-authoring.import.result =Import tool content result
-authoring.title.import =Import questions
-authoring.import.instruction =Please choose questions to import.
-button.select.importfile =Select file to import
-msg.import.file.format =The import file must be .xml file exported from assessment tool and not exceed size of {0}
-label.import.file =Import xml file
-button.import =Import
-label.authoring.basic.import.questions =Import
-label.authoring.basic.export.questions =Export
-label.authoring.advance.display.summary =Display all questions and answers once the learner finishes.
-label.authoring.basic.import.qti =Import IMS QTI
-advanced.reflectOnActivity =Add a notebook at end of Assessment with the following instructions:
-monitor.summary.td.addNotebook =Add a notebook at end of Assessment
-monitor.summary.td.notebookInstructions =Notebook instructions
-label.export.reflection =Notebook Entries
-label.continue =Continue
-label.edit =Edit
-label.submit =Finish
-label.authoring.advance.numbered.questions =Enable questions' numbering
-label.learning.draft.autosaved =Draft autosaved
-label.waiting.for.leader =Please, wait while somebody will become a group leader
-label.users.from.group =Other learners participating in current group:
-label.use.select.leader.tool.output =Use leaders from Select Leader tool
-label.group.leader =Group leader: {0}
-label.refresh =Refresh
-label.display.name.column =Display name column
-label.authoring.answer.required =Answer required?
-warn.answers.required =Please, answer highlighted questions in order to continue.
-label.authoring.basic.export.qti =Export IMS QTI
-label.monitoring.heading =Assessment Monitoring
-label.maximum.number.words =Maximum number of words
-label.minimum.number.words =Minimum number of words
-label.info.maximum.number.words =This answer must have a maximum of {0} words.
-label.info.minimum.number.words =This answer must have a minimum of {0} words.
-label.info.max.and.min.number.words =This answer must have a minimal of {0} and maximum of {1} words.
-warn.answers.word.requirements.limit =In order to continue, please note the word limit restrictions.
-label.words =Words:
-message.no.reflection.available =No notebook entry has been added.
-label.authoring.basic.type.mark.hedging =Mark hedging
-label.option.correct =Correct?
-label.assign.hedging.mark =Assign marks to answers. Max possible mark: {0}
-label.learning.submit =Submit
-warn.mark.hedging.wrong.total =In order to continue, all mark hedging questions should have all available marks assigned.
-label.incorrect.answer.nullifies.mark =Assigns full mark only when the correct answers are selected.
-label.export.summary =Summary
-label.justify.hedging.marks =Please, justify your mark allocation.
-label.select.leader =Leader selection
-label.question.options =Question options
-label.activity.completion =End of activity
-label.notifications =Notifications
-label.ask.for.hedging.justification =Ask for hedging justification?
-label.number.learners.per.session =Number of learners per session
-label.tool.output =Tool Output
-output.desc.best.score =Best score
-label.tool.output.has.been.changed =Tool Output has been changed
-output.desc.first.score =First score
-output.desc.average.score =Average score
-label.waiting.for.leader.launch.time.limit =Leader has not started the activity. Please wait until he/she commences it.
-label.waiting.for.leader.finish =Time limit set by teacher is over. Please wait until a group leader submits all answers.
-warn.mark.hedging.wrong.justification =Justification cannot be left blank
-error.import.file.format =The import file is not an .xml file.
-label.file =File
-errors.maxfilesize =File exceeds maximum file size {0}
-label.summary.downloaded =Summary downloaded
-label.not.answered =Not Answered
-label.other =Other
-label.graph.help =In the graph(s) below, click on a bar in the graph and then use your mouse wheel to zoom in and out of the graph. Once you zoom in, the grey selection in the bottom graph can be dragged left or right to show a different set of marks.
-label.lowest.mark =Lowest mark:
-label.highest.mark =Highest mark:
-label.number.learners =Number of learners
-label.percentage =Percentage
-label.operation.failed =Operation failed.
-label.number.groups.finished =Number of groups finished
-label.marks =Marks
-label.number.learners.in.mark.range =Number of learners in mark range
-label.number.groups.in.mark.range =Number of groups in mark range
-label.average.mark =Average mark
-label.error =Error
-error.loaderror =There was an error loading the grid. If this problem persists, please contact your system administrator.
-label.ok =OK
-message.monitoring.edit.activity.warning =Warning: if you edit and modify a question or change an answer that when a student has already answer, the marks will be recalculated based on the changes.
-label.enable.confidence.levels =Enable confidence level
-label.what.is.your.confidence.level =How confident are you of your answer?
-label.confidence =Confidence
-label.no.question.references =No questions have been added to the question list. Do you still want to proceed with no questions?
-label.hide.name.column =Hide name column
-label.ae.questions.marks =AE Questions & Marks
-label.ira.questions.marks =iRA Questions & Marks
-label.attendance =Attendance
-label.show.students.choices =Show students' choices
-label.hide.students.choices =Hide students' choices
-label.print =Print
-label.excel.export =Excel export
-label.teams =Teams
-label.no.questions.in.question.bank =No questions have been added to the question list. Do you still want to proceed with no questions?
-label.authoring.advance.disclose.answers =Disclose learner's and other groups' answers in monitor
-label.learning.summary.other.team.answers =Other teams' answers
-label.learning.summary.selected.by =Selected by:
-label.disclose.correct.answers =Disclose correct answers
-label.disclose.groups.answers =Disclose groups' answers
-label.disclose.all.correct.answers =Disclose all correct answers
-label.disclose.all.groups.answers =Disclose all groups' answers
-label.prefix.sequential.letters.for.each.answer =Prefix sequential letters for each answer
-label.edit.in.monitor.warning =Attention: while you edit this assessment students don't have access to it. You must save your changes so students can re-attempt this assessment again.
-outcome.authoring.title =Learning outcomes
-outcome.authoring.input =Search and select by outcome name or code
-outcome.authoring.existing =Added outcomes
-outcome.authoring.existing.none =none
-authoring.fla.branch.mapping.ordered.asc =Start with branches mapped to highest ordered answers
-warn.tool.output.change.none =This will delete all existing marks for this activity. Are you sure?
-output.desc.none =No score
-output.ordered.answers.for.question =Ordered answers for the question:
-label.answer.required =Answer required
-outcome.authoring.remove.confirm =Are you sure you want to remove this learning outcome?
-
-
-#======= End labels: Exported 343 labels for en AU =====
+appName = assessment
+#language code: en
+#locale code: AU
+
+ # Exported from the LAMS Community by Ernie Ghiglione on Fri Dec 28 09:17:35 CST 2018
+
+#=================== labels for Assessment =================#
+
+appName =Assessment Tool
+activity.description =Tool for assessing learners
+activity.helptext =Create questions to assess learners.
+tool.display.name =Assessment Tool
+tool.description =Tool for assessing learners.
+label.authoring.heading =Assessment Authoring
+label.author.title =Assessment
+label.authoring.heading.basic =Basic
+label.authoring.heading.basic.desc =Basic input information for assessment tool
+label.authoring.heading.advance.desc =Please input advance options for assessment tool
+label.authoring.basic.title =Title
+label.authoring.basic.question.name =Question name
+label.authoring.basic.question.text =Question text
+label.authoring.basic.default.question.grade =Default question grade
+label.authoring.basic.penalty.factor =Penalty factor
+label.authoring.basic.general.feedback =General feedback
+label.authoring.basic.shuffle.the.choices =Shuffle answers?
+label.authoring.basic.add.question =Add question
+label.authoring.basic.question.list.title =Question list
+label.authoring.basic.list.header.type =Type
+label.authoring.basic.list.header.question =Question
+label.authoring.basic.type.multiple.choice =Multiple choice
+label.authoring.basic.type.matching.pairs =Matching pairs
+label.authoring.basic.type.short.answer =Short answer
+label.authoring.basic.type.numerical =Numerical
+label.authoring.basic.type.true.false =True/False
+label.authoring.basic.type.essay =Essay
+label.authoring.basic.type.ordering =Ordering
+label.authoring.basic.edit =Edit
+label.authoring.basic.delete =Delete
+label.authoring.basic.down =Move down
+label.authoring.basic.up =Move Up
+label.authoring.basic.option.answer =Answer
+label.authoring.basic.option.question =Question
+label.authoring.basic.option.grade =Grade
+label.authoring.basic.option.feedback =Feedback
+label.authoring.basic.option.accepted.error =Accepted error
+label.authoring.basic.unit.unit =Unit
+label.authoring.basic.unit.multiplier =Multiplier
+label.authoring.basic.none =None
+label.authoring.choice.add.multiple.choice =Add multiple choice
+label.authoring.choice.field.required =This field is required.
+label.authoring.choice.enter.integer =Please enter an integer.
+label.authoring.choice.enter.float =Please enter a floating point number.
+label.authoring.choice.one.multiple.answers =One or multiple answers?
+label.authoring.choice.one.answer =One answer only
+label.authoring.choice.multiple.answers =Multiple answers allowed
+label.authoring.choice.overall.feedback =Overall feedback
+label.authoring.choice.feedback.on.correct =For any correct response
+label.authoring.choice.feedback.on.partially.correct =For any partially correct response
+label.authoring.choice.feedback.on.incorrect =For any incorrect response
+label.authoring.choice.add.option =Add another answer
+label.authoring.matching.pairs.add.matching.pairs =Add question
+label.authoring.matching.pairs.matching.pairs =Matching pairs
+label.authoring.matching.pairs.error.one.matching.pair =You should provide at least 1 matching pair.
+label.authoring.matching.pairs.add.matching.pair =Add another
+label.authoring.short.answer.no.case.unimportant =No, case is unimportant
+label.authoring.short.answer.yes.case.must.match =Yes, case must match
+label.authoring.short.answer.case.sensitivity =Case sensitivity
+label.authoring.short.answer.answers =Answers
+label.authoring.short.answer.add.answer =Add another answer
+label.authoring.short.answer.add.short.answer =Add question
+label.authoring.true.false.question =True/False question
+label.authoring.true.false.correct.answer =Correct answer
+label.authoring.true.false.false =False
+label.authoring.true.false.true =True
+label.authoring.true.false.feedback.on.true =Feedback for the response 'True'.
+label.authoring.true.false.feedback.on.false =Feedback for the response 'False'.
+label.authoring.true.false.add.true.false =Add question
+label.authoring.numerical.question =Numerical question
+label.authoring.numerical.answers =Answers
+label.authoring.numerical.units =Units
+label.authoring.numerical.error.answer =You should provide at least one possible answer.
+label.authoring.numerical.add.answer =Add another answer
+label.authoring.numerical.add.numerical =Add question
+label.authoring.numerical.add.unit =Add another unit
+label.authoring.essay.add.essay =Add question
+label.authoring.ordering.add.ordering =Add question
+label.authoring.advance.allow.students.overall.feedback =Display overall feedback at the end of each attempt
+label.authoring.advance.time.limit =Time limit (minutes)
+label.authoring.advance.questions.per.page =Questions per page
+label.authoring.advance.all.in.one.page =All in one page
+label.authoring.advance.shuffle.questions =Shuffle questions
+label.authoring.advance.attempts.allowed =Attempts allowed
+label.authoring.advance.unlimited =Unlimited
+label.authoring.advance.allow.students.question.feedback =Allow learners to see question feedback after each question
+label.authoring.advance.allow.students.right.wrong.answers =Allow learners to see right/wrong answers
+label.authoring.advance.allow.students.grades =Allow learners to see grades at the end of each attempt
+label.authoring.advance.allow.students.history.responses =Allow learners to see history of responses at the end of each attempt
+label.authoring.advance.overall.feedback =Overall feedback
+label.authoring.advance.grade.boundary =Grade boundary
+label.authoring.advance.feedback =Feedback
+label.authoring.advance.add.feedback.field =Add feedback
+label.authoring.cancel.button =Cancel
+label.authoring.basic.answer.options =Answer options
+label.authoring.basic.instruction =Instructions
+error.default.grade.wrong.format =Default question grade should be of numeric format
+error.penalty.factor.wrong.format =Penalty factor should be of float format
+error.question.name.blank =Question name can not be blank.
+error.question.text.blank =Question text can not be blank.
+error.msg.default.content.not.find =Could not retrieve default content record for this tool.
+error.monitoring.export.excel =Export assessment report failed because of this reason: {0}
+authoring.msg.cancel.save =Do you want to close this window without saving?
+authoring.msg.one.question.to.be.saved =There must be at least one question to be saved.
+label.learning.page =Page:
+label.learning.title =Assessment
+label.learning.choose.one.answer =Choose one of the following answers.
+label.learning.choose.at.least.one.answer =Choose at least one answer.
+label.learning.matching.pairs.pick.up =Pick up the corresponding answers
+label.learning.matching.pairs.choose =Choose
+label.learning.short.answer.answer =Answer:
+label.learning.true.false.true =True
+label.learning.true.false.false =False
+label.learning.ordering.sort.answers =Sort answers in the right order
+label.learning.marks =Marks for this submission: {0}/{1}.
+label.learning.penalty =This submission attracted a penalty of {0}.
+label.learning.finish.test =Finish
+label.learning.submit.all =Submit all
+label.learning.next.activity =Next Activity
+label.learning.resubmit =Resubmit
+label.learning.summary.started.on =Started on
+label.learning.summary.completed.on =Completed on
+label.learning.summary.time.taken =Time taken (minutes)
+label.learning.summary.hours =hour(s)
+label.learning.summary.minutes =minutes
+label.learning.summary.grade =Grade
+label.learning.summary.out.of.maximum =out of a maximum of
+label.learning.summary.feedback =Feedback
+label.learning.question.summary.history.responces =History of responses:
+label.learning.question.summary.response =Response
+label.learning.question.summary.grade =Grade
+label.learning.countdown.time.left =Time left
+label.learning.blockui.time.is.over =Time is over. Processing your answers...
+label.learning.blockui.are.you.ready =You are going to participate in activity that has time limitation. Are you ready to start?
+monitoring.tab.summary =Summary
+monitoring.tab.statistics =Stats
+monitoring.tab.edit.activity =Edit Activity
+monitoring.label.group =Group
+monitoring.label.user.name =Name
+label.monitoring.edit.activity.edit =Edit
+label.monitoring.summary.summary =Summary
+label.monitoring.summary.double.click =Double click on learner's name to get full individual report.
+label.monitoring.summary.report.by.question =Report by question
+label.monitoring.summary.export.summary =Export summary
+label.monitoring.summary.results.question =Detailed question results
+label.monitoring.summary.choose =Choose...
+label.monitoring.summary.user.name =Name
+label.monitoring.summary.total =Total
+label.monitoring.summary.learner.summary =Learner summary
+label.monitoring.user.summary.history.responses =History of responses
+label.monitoring.user.summary.user.name =Username
+label.monitoring.user.summary.number.attempts =Number of attempts
+label.monitoring.user.summary.time.last.attempt =Time in the last attempt
+label.monitoring.user.summary.last.attempt.grade =Last attempt grade
+label.monitoring.user.summary.attempt =Attempt
+label.monitoring.user.summary.time =Time
+label.monitoring.user.summary.response =Response
+label.monitoring.user.summary.grade =Grade
+label.monitoring.user.summary.title =Title:
+label.monitoring.user.summary.question =Question:
+label.monitoring.user.summary.ok =Ok
+label.monitoring.question.summary.history.responses =Responses for the question
+label.monitoring.question.summary.title =Title
+label.monitoring.question.summary.question =Question
+label.monitoring.question.summary.default.mark =Default mark
+label.monitoring.question.summary.penalty =Penalty
+label.monitoring.question.summary.average.mark =Average mark
+label.monitoring.question.summary.group =Group:
+label.monitoring.question.summary.ok =Ok
+output.desc.learner.total.score =Last total score
+output.desc.learner.time.taken =Time taken
+output.desc.learner.number.of.attempts =Number of attempts
+output.user.score.for.question =Score for the question:
+error.form.validation.error =You have 1 error in a form. It has been highlighted
+error.form.validation.errors =You have {0} errors in a form. They have been highlighted
+error.form.validation.hundred.score =One of the answers should have a grade of 100% so it is possible to get full marks for this question.
+error.form.validation.positive.accepted.errors =All the accepted errors should be positive.
+message.monitoring.summary.no.session =No learners yet
+label.cancel =Cancel
+define.later.message =Please wait for the instructor to complete the contents of this activity.
+button.try.again =Try again
+activity.title =Assessment
+label.authoring.save.button =Save
+label.authoring.heading.advance =Advanced
+label.down =Move down
+label.finished =Next Activity
+label.finish =Finished
+label.on =On
+label.off =Off
+monitor.summary.th.advancedSettings =Advanced settings
+label.authoring.advanced.notify.on.attempt.completion =Notify instructor when learner completes attempt
+event.learner.completes.attempt.subject =LAMS: Learner completed attempt in Assessment tool
+event.learner.completes.attempt.body =The learner {0} completed attempt in Assessment tool.\n\nThis message was send automatically, following tool''''s advanced settings.
+message.alertContentEdit =Note: One or more learners have accessed this activity and it cannot longer be modified.
+warning.msg.authoring.do.you.want.to.delete =Do you really want to delete this question?
+label.export.exported.on =Exported on:
+label.export.question.summary =Question summary
+label.export.user.summary =Learner summary
+label.export.date.attempted =Date attempted
+label.export.mark =Mark
+label.export.time.taken =Time taken from activity start (seconds)
+label.export.average =Average
+label.export.summary.by.user =Summary by learner
+lable.export.summary.by.question =Summary by question
+label.export.user.id =Username
+label.authoring.basic.allow.learners.rich.editor =Allow learners to use rich text editor
+label.authoring.advance.allow.students.right.answers =Indicate choice(s) that have been answered correctly.
+label.authoring.advance.allow.students.wrong.answers =Indicate choice(s) that have been answered incorrectly.
+monitor.summary.date.restriction =Deadline
+monitor.summary.when.date.restriction.is.set =Learners will not be able to take this assessment after the set date and time.
+monitor.summary.after.date =Date/time:
+monitor.summary.set.restriction =Set restriction
+monitor.summary.unset.restriction =Remove restriction
+authoring.info.teacher.set.restriction =For this activity, the instructor fixed a deadline until {0}. After this time this activity will not be available.
+monitor.summary.notification =Notification
+monitor.summary.date.restriction.set =Deadline has been set
+monitor.summary.date.restriction.removed =Deadline has been removed
+label.authoring.advance.passing.mark =Assessment passing mark
+label.authoring.advance.choose.restriction =Choose restriction:
+label.authoring.advance.passing.mark.none =None
+label.learning.havent.reached.passing.mark =Sorry, you haven''t scored {0} required to pass the activity. Please, try one more time.
+label.authoring.basic.add.question.to.pool =Add question
+label.authoring.basic.add.question.to.list =Add question to list
+label.authoring.basic.question.bank.title =Question bank
+label.authoring.basic.list.header.mark =Mark
+label.authoring.basic.type.random.question =Random question
+label.authoring.basic.select.random.question =Random question from pool
+label.authoring.basic.random.question =Question
+label.authoring.basic.warning.too.many.questions =Too many questions in a list. Please, remove some of them.
+authoring.import.result =Import tool content result
+authoring.title.import =Import questions
+authoring.import.instruction =Please choose questions to import.
+button.select.importfile =Select file to import
+msg.import.file.format =The import file must be .xml file exported from assessment tool and not exceed size of {0}
+label.import.file =Import xml file
+button.import =Import
+label.authoring.basic.import.questions =Import
+label.authoring.basic.export.questions =Export
+label.authoring.advance.display.summary =Display all questions and answers once the learner finishes.
+label.authoring.basic.import.qti =Import IMS QTI
+advanced.reflectOnActivity =Add a notebook at end of Assessment with the following instructions:
+monitor.summary.td.addNotebook =Add a notebook at end of Assessment
+monitor.summary.td.notebookInstructions =Notebook instructions
+label.export.reflection =Notebook Entries
+label.continue =Continue
+label.edit =Edit
+label.submit =Finish
+label.authoring.advance.numbered.questions =Enable questions' numbering
+label.learning.draft.autosaved =Draft autosaved
+label.waiting.for.leader =Please, wait while somebody will become a group leader
+label.users.from.group =Other learners participating in current group:
+label.use.select.leader.tool.output =Use leaders from Select Leader tool
+label.group.leader =Group leader: {0}
+label.refresh =Refresh
+label.display.name.column =Display name column
+label.authoring.answer.required =Answer required?
+warn.answers.required =Please, answer highlighted questions in order to continue.
+label.authoring.basic.export.qti =Export IMS QTI
+label.monitoring.heading =Assessment Monitoring
+label.maximum.number.words =Maximum number of words
+label.minimum.number.words =Minimum number of words
+label.info.maximum.number.words =This answer must have a maximum of {0} words.
+label.info.minimum.number.words =This answer must have a minimum of {0} words.
+label.info.max.and.min.number.words =This answer must have a minimal of {0} and maximum of {1} words.
+warn.answers.word.requirements.limit =In order to continue, please note the word limit restrictions.
+label.words =Words:
+message.no.reflection.available =No notebook entry has been added.
+label.authoring.basic.type.mark.hedging =Mark hedging
+label.option.correct =Correct?
+label.assign.hedging.mark =Assign marks to answers. Max possible mark: {0}
+label.learning.submit =Submit
+warn.mark.hedging.wrong.total =In order to continue, all mark hedging questions should have all available marks assigned.
+label.incorrect.answer.nullifies.mark =Assigns full mark only when the correct answers are selected.
+label.export.summary =Summary
+label.justify.hedging.marks =Please, justify your mark allocation.
+label.select.leader =Leader selection
+label.question.options =Question options
+label.activity.completion =End of activity
+label.notifications =Notifications
+label.ask.for.hedging.justification =Ask for hedging justification?
+label.number.learners.per.session =Number of learners per session
+label.tool.output =Tool Output
+output.desc.best.score =Best score
+label.tool.output.has.been.changed =Tool Output has been changed
+output.desc.first.score =First score
+output.desc.average.score =Average score
+label.waiting.for.leader.launch.time.limit =Leader has not started the activity. Please wait until he/she commences it.
+label.waiting.for.leader.finish =Time limit set by teacher is over. Please wait until a group leader submits all answers.
+warn.mark.hedging.wrong.justification =Justification cannot be left blank
+error.import.file.format =The import file is not an .xml file.
+label.file =File
+errors.maxfilesize =File exceeds maximum file size {0}
+label.summary.downloaded =Summary downloaded
+label.not.answered =Not Answered
+label.other =Other
+label.graph.help =In the graph(s) below, click on a bar in the graph and then use your mouse wheel to zoom in and out of the graph. Once you zoom in, the grey selection in the bottom graph can be dragged left or right to show a different set of marks.
+label.lowest.mark =Lowest mark:
+label.highest.mark =Highest mark:
+label.number.learners =Number of learners
+label.percentage =Percentage
+label.operation.failed =Operation failed.
+label.number.groups.finished =Number of groups finished
+label.marks =Marks
+label.number.learners.in.mark.range =Number of learners in mark range
+label.number.groups.in.mark.range =Number of groups in mark range
+label.average.mark =Average mark
+label.error =Error
+error.loaderror =There was an error loading the grid. If this problem persists, please contact your system administrator.
+label.ok =OK
+message.monitoring.edit.activity.warning =Warning: if you edit and modify a question or change an answer that when a student has already answer, the marks will be recalculated based on the changes.
+label.enable.confidence.levels =Enable confidence level
+label.what.is.your.confidence.level =How confident are you of your answer?
+label.confidence =Confidence
+label.no.question.references =No questions have been added to the question list. Do you still want to proceed with no questions?
+label.hide.name.column =Hide name column
+label.ae.questions.marks =AE Questions & Marks
+label.ira.questions.marks =iRA Questions & Marks
+label.attendance =Attendance
+label.show.students.choices =Show students' choices
+label.hide.students.choices =Hide students' choices
+label.print =Print
+label.excel.export =Excel export
+label.teams =Teams
+label.no.questions.in.question.bank =No questions have been added to the question list. Do you still want to proceed with no questions?
+label.authoring.advance.disclose.answers =Disclose learner's and other groups' answers in monitor
+label.learning.summary.other.team.answers =Other teams' answers
+label.learning.summary.selected.by =Selected by:
+label.disclose.correct.answers =Disclose correct answers
+label.disclose.groups.answers =Disclose groups' answers
+label.disclose.all.correct.answers =Disclose all correct answers
+label.disclose.all.groups.answers =Disclose all groups' answers
+label.prefix.sequential.letters.for.each.answer =Prefix sequential letters for each answer
+label.edit.in.monitor.warning =Attention: while you edit this assessment students don't have access to it. You must save your changes so students can re-attempt this assessment again.
+outcome.authoring.title =Learning outcomes
+outcome.authoring.input =Search and select by outcome name or code
+outcome.authoring.existing =Added outcomes
+outcome.authoring.existing.none =none
+authoring.fla.branch.mapping.ordered.asc =Start with branches mapped to highest ordered answers
+warn.tool.output.change.none =This will delete all existing marks for this activity. Are you sure?
+output.desc.none =No score
+output.ordered.answers.for.question =Ordered answers for the question:
+label.answer.required =Answer required
+outcome.authoring.remove.confirm =Are you sure you want to remove this learning outcome?
+label.qb.stats =Question indexes
+label.qb.participant.count =Test participant count
+label.qb.difficulty.index =Difficulty index
+label.qb.discrimination.index =Discrimination index
+label.qb.point.biserial =Point biserial
+
+#======= End labels: Exported 337 labels for en AU =====
Index: lams_tool_assessment/conf/language/lams/ApplicationResources_en_AU.properties
===================================================================
diff -u -r1ba75f43a383fb925aae69975d748d0a8dfdf9a5 -r394f403c289f0fd7808c228840bead5c4e7d5d32
--- lams_tool_assessment/conf/language/lams/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision 1ba75f43a383fb925aae69975d748d0a8dfdf9a5)
+++ lams_tool_assessment/conf/language/lams/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision 394f403c289f0fd7808c228840bead5c4e7d5d32)
@@ -2,7 +2,7 @@
#language code: en
#locale code: AU
- # Exported from the LAMS Community by Ernie Ghiglione on Fri Apr 05 03:05:53 CST 2019
+ # Exported from the LAMS Community by Ernie Ghiglione on Fri Dec 28 09:17:35 CST 2018
#=================== labels for Assessment =================#
@@ -119,7 +119,7 @@
label.learning.short.answer.answer =Answer:
label.learning.true.false.true =True
label.learning.true.false.false =False
-label.learning.ordering.sort.answers =Sort answers in the right order (click on the answers to drag-and-drop in order).
+label.learning.ordering.sort.answers =Sort answers in the right order
label.learning.marks =Marks for this submission: {0}/{1}.
label.learning.penalty =This submission attracted a penalty of {0}.
label.learning.finish.test =Finish
@@ -166,13 +166,15 @@
label.monitoring.user.summary.grade =Grade
label.monitoring.user.summary.title =Title:
label.monitoring.user.summary.question =Question:
+label.monitoring.user.summary.ok =Ok
label.monitoring.question.summary.history.responses =Responses for the question
label.monitoring.question.summary.title =Title
label.monitoring.question.summary.question =Question
label.monitoring.question.summary.default.mark =Default mark
label.monitoring.question.summary.penalty =Penalty
label.monitoring.question.summary.average.mark =Average mark
label.monitoring.question.summary.group =Group:
+label.monitoring.question.summary.ok =Ok
output.desc.learner.total.score =Last total score
output.desc.learner.time.taken =Time taken
output.desc.learner.number.of.attempts =Number of attempts
@@ -347,6 +349,10 @@
output.ordered.answers.for.question =Ordered answers for the question:
label.answer.required =Answer required
outcome.authoring.remove.confirm =Are you sure you want to remove this learning outcome?
-label.close =Close
+label.qb.stats =Question indexes
+label.qb.participant.count =Test participant count
+label.qb.difficulty.index =Difficulty index
+label.qb.discrimination.index =Discrimination index
+label.qb.point.biserial =Point biserial
-#======= End labels: Exported 343 labels for en AU =====
+#======= End labels: Exported 337 labels for en AU =====
Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/AssessmentConstants.java
===================================================================
diff -u -r21e3286385ca1c464997e9792460b7712d23dcdd -r394f403c289f0fd7808c228840bead5c4e7d5d32
--- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/AssessmentConstants.java (.../AssessmentConstants.java) (revision 21e3286385ca1c464997e9792460b7712d23dcdd)
+++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/AssessmentConstants.java (.../AssessmentConstants.java) (revision 394f403c289f0fd7808c228840bead5c4e7d5d32)
@@ -30,31 +30,10 @@
public static final int COMPLETED = 1;
- public static final int INITIAL_OPTIONS_NUMBER = 3;
-
- public static final int INITIAL_UNITS_NUMBER = 2;
-
public static final int INITIAL_OVERALL_FEEDBACK_NUMBER = 3;
public static final String EXPORT_QUESTIONS_FILENAME = "questions.xml";
- // question type;
- public static final short QUESTION_TYPE_MULTIPLE_CHOICE = 1;
-
- public static final short QUESTION_TYPE_MATCHING_PAIRS = 2;
-
- public static final short QUESTION_TYPE_SHORT_ANSWER = 3;
-
- public static final short QUESTION_TYPE_NUMERICAL = 4;
-
- public static final short QUESTION_TYPE_TRUE_FALSE = 5;
-
- public static final short QUESTION_TYPE_ESSAY = 6;
-
- public static final short QUESTION_TYPE_ORDERING = 7;
-
- public static final short QUESTION_TYPE_MARK_HEDGING = 8;
-
// for parameters' name
public static final String PARAM_WAITING_MESSAGE_KEY = "waitingMessageKey";
@@ -69,7 +48,7 @@
public static final String PARAM_QUESTION_INDEX = "questionIndex";
- public static final String PARAM_QUESTION_SEQUENCE_ID = "questionSequenceId";
+ public static final String PARAM_QUESTION_DISPLAY_ORDER = "questionDisplayOrder";
public static final String PARAM_QUESTION_REFERENCE_INDEX = "questionReferenceIndex";
@@ -82,6 +61,8 @@
public static final String PARAM_NOT_A_NUMBER = "nan";
public static final String PARAM_GRADE = "grade";
+
+ public static final String PARAM_MAX_MARK = "maxMark";
public static final String PARAM_SESSION_ID = "sessionId";
@@ -104,28 +85,6 @@
public static final String ATTR_TOOL_SESSION_ID = "toolSessionID";
- public static final String ATTR_OPTION_LIST = "optionList";
-
- public static final String ATTR_OPTION_COUNT = "optionCount";
-
- public static final String ATTR_OPTION_STRING_PREFIX = "optionString";
-
- public static final String ATTR_OPTION_GRADE_PREFIX = "optionGrade";
-
- public static final String ATTR_OPTION_CORRECT = "optionCorrect";
-
- public static final String ATTR_OPTION_FLOAT_PREFIX = "optionFloat";
-
- public static final String ATTR_OPTION_ACCEPTED_ERROR_PREFIX = "optionAcceptedError";
-
- public static final String ATTR_OPTION_FEEDBACK_PREFIX = "optionFeedback";
-
- public static final String ATTR_OPTION_UID_PREFIX = "optionUid";
-
- public static final String ATTR_OPTION_SEQUENCE_ID_PREFIX = "optionSequenceId";
-
- public static final String ATTR_OPTION_QUESTION_PREFIX = "optionQuestion";
-
public static final String ATTR_QUESTION_PREFIX = "question";
public static final String ATTR_CONFIDENCE_LEVEL_PREFIX = "confidenceLevel";
@@ -144,22 +103,14 @@
public static final String ATTR_UNIT_LIST = "unitList";
- public static final String ATTR_QUESTION_REFERENCES_GRADES = "referenceGrades";
+ public static final String ATTR_QUESTION_REFERENCES_MAX_MARKS = "referenceMaxMarks";
public static final String ATTR_HAS_EDIT_RIGHT = "hasEditRight";
public static final String ATTR_IS_TIME_LIMIT_NOT_LAUNCHED = "isTimeLimitNotLaunched";
public static final String ATTR_SECONDS_LEFT = "secondsLeft";
- public static final String ATTR_UNIT_COUNT = "unitCount";
-
- public static final String ATTR_UNIT_UNIT_PREFIX = "unitUnit";
-
- public static final String ATTR_UNIT_MULTIPLIER_PREFIX = "unitMultiplier";
-
- public static final String ATTR_UNIT_SEQUENCE_ID_PREFIX = "unitSequenceId";
-
public static final String ATTR_OVERALL_FEEDBACK_LIST = "overallFeedbackList";
public static final String ATTR_OVERALL_FEEDBACK_COUNT = "overallFeedbackCount";
@@ -251,15 +202,7 @@
public static final String OUTPUT_NAME_ORDERED_ANSWERS = "ordered.answers";
public static final String OUTPUT_NAME_CONDITION_ORDERED_ANSWER = "ordered.answer";
- // error message keys
- public static final String ERROR_MSG_QUESTION_NAME_BLANK = "error.question.name.blank";
-
- public static final String ERROR_MSG_QUESTION_TEXT_BLANK = "error.question.text.blank";
-
- public static final String ERROR_MSG_DEFAULT_GRADE_WRONG_FORMAT = "error.default.grade.wrong.format";
-
- public static final String ERROR_MSG_PENALTY_FACTOR_WRONG_FORMAT = "error.penalty.factor.wrong.format";
-
+
public static final String ATTR_USER_UID = "userUid";
public static final String DEFUALT_PROTOCOL_REFIX = "http://";
Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/Assessment.java
===================================================================
diff -u -rbd4fa408454e7389b4e60bc68f2488de88eff663 -r394f403c289f0fd7808c228840bead5c4e7d5d32
--- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/Assessment.java (.../Assessment.java) (revision bd4fa408454e7389b4e60bc68f2488de88eff663)
+++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/Assessment.java (.../Assessment.java) (revision 394f403c289f0fd7808c228840bead5c4e7d5d32)
@@ -150,10 +150,9 @@
private AssessmentUser createdBy;
// Question bank questions
- @OneToMany(cascade = CascadeType.ALL)
+ @OneToMany
@JoinColumn(name = "assessment_uid")
- @OrderBy("sequence_id ASC")
- private Set questions = new TreeSet<>(new SequencableComparator());
+ private Set questions = new TreeSet<>();
// assessment questions references that form question list
@OneToMany(cascade = CascadeType.ALL)
@@ -192,7 +191,7 @@
// clone questions
if (questions != null) {
Iterator iter = questions.iterator();
- TreeSet set = new TreeSet<>(new SequencableComparator());
+ TreeSet set = new TreeSet<>();
while (iter.hasNext()) {
AssessmentQuestion question = iter.next();
AssessmentQuestion newQuestion = (AssessmentQuestion) question.clone();
@@ -213,7 +212,7 @@
// update questionReferences with new cloned question
if (newQuestionReference.getQuestion() != null) {
for (AssessmentQuestion newQuestion : assessment.questions) {
- if (newQuestion.getSequenceId() == newQuestionReference.getQuestion().getSequenceId()) {
+ if (newQuestion.getDisplayOrder() == newQuestionReference.getQuestion().getDisplayOrder()) {
newQuestionReference.setQuestion(newQuestion);
break;
}
@@ -482,6 +481,9 @@
public void setContentId(Long contentId) {
this.contentId = contentId;
+ for (AssessmentQuestion question : questions) {
+ question.setToolContentId(contentId);
+ }
}
public boolean isAllowQuestionFeedback() {
Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentOutputFactory.java
===================================================================
diff -u -rbd4fa408454e7389b4e60bc68f2488de88eff663 -r394f403c289f0fd7808c228840bead5c4e7d5d32
--- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentOutputFactory.java (.../AssessmentOutputFactory.java) (revision bd4fa408454e7389b4e60bc68f2488de88eff663)
+++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentOutputFactory.java (.../AssessmentOutputFactory.java) (revision 394f403c289f0fd7808c228840bead5c4e7d5d32)
@@ -31,6 +31,8 @@
import java.util.TreeSet;
import org.lamsfoundation.lams.learningdesign.BranchCondition;
+import org.lamsfoundation.lams.qb.model.QbOption;
+import org.lamsfoundation.lams.qb.model.QbQuestion;
import org.lamsfoundation.lams.tool.OutputFactory;
import org.lamsfoundation.lams.tool.ToolOutput;
import org.lamsfoundation.lams.tool.ToolOutputDefinition;
@@ -39,7 +41,6 @@
import org.lamsfoundation.lams.tool.assessment.model.Assessment;
import org.lamsfoundation.lams.tool.assessment.model.AssessmentOptionAnswer;
import org.lamsfoundation.lams.tool.assessment.model.AssessmentQuestion;
-import org.lamsfoundation.lams.tool.assessment.model.AssessmentQuestionOption;
import org.lamsfoundation.lams.tool.assessment.model.AssessmentQuestionResult;
import org.lamsfoundation.lams.tool.assessment.model.AssessmentResult;
import org.lamsfoundation.lams.tool.assessment.model.AssessmentSession;
@@ -52,12 +53,11 @@
/**
* @see org.lamsfoundation.lams.tool.OutputDefinitionFactory#getToolOutputDefinitions(java.lang.Object)
*/
- @SuppressWarnings("unchecked")
@Override
public SortedMap getToolOutputDefinitions(Object toolContentObject,
int definitionType) {
- TreeMap definitionMap = new TreeMap();
+ TreeMap definitionMap = new TreeMap<>();
ToolOutputDefinition definition = buildRangeDefinition(AssessmentConstants.OUTPUT_NAME_LEARNER_NUMBER_ATTEMPTS,
0L, null);
@@ -68,12 +68,12 @@
if (toolContentObject != null) {
Assessment assessment = (Assessment) toolContentObject;
- Set questionReferences = new TreeSet(new SequencableComparator());
+ Set questionReferences = new TreeSet<>(new SequencableComparator());
questionReferences.addAll(assessment.getQuestionReferences());
Long totalMarksPossible = 0L;
for (QuestionReference questionReference : questionReferences) {
- totalMarksPossible += questionReference.getDefaultGrade();
+ totalMarksPossible += questionReference.getMaxMark();
}
definition = buildRangeDefinition(AssessmentConstants.OUTPUT_NAME_LEARNER_TOTAL_SCORE, 0L,
totalMarksPossible, true);
@@ -98,16 +98,16 @@
int randomQuestionsCount = 1;
for (QuestionReference questionReference : questionReferences) {
Long markAvailable = null;
- if (questionReference.getDefaultGrade() != 0) {
- markAvailable = Long.valueOf(questionReference.getDefaultGrade());
+ if (questionReference.getMaxMark() != 0) {
+ markAvailable = Long.valueOf(questionReference.getMaxMark());
}
String description = getI18NText("output.user.score.for.question", false) + " ";
if (questionReference.isRandomQuestion()) {
description += getI18NText("label.authoring.basic.type.random.question", false)
+ randomQuestionsCount++;
} else {
- description += questionReference.getQuestion().getTitle();
+ description += questionReference.getQuestion().getQbQuestion().getName();
}
definition = buildRangeDefinition(String.valueOf(questionReference.getSequenceId()), 0L, markAvailable);
@@ -116,22 +116,22 @@
}
for (AssessmentQuestion question : assessment.getQuestions()) {
- if (question.getType() == AssessmentConstants.QUESTION_TYPE_ORDERING) {
+ if (question.getType() == QbQuestion.TYPE_ORDERING) {
String outputName = AssessmentConstants.OUTPUT_NAME_ORDERED_ANSWERS + "#"
- + question.getSequenceId();
+ + question.getDisplayOrder();
ToolOutputDefinition orderedAnswersDefinition = buildLongOutputDefinition(outputName);
orderedAnswersDefinition.setShowConditionNameOnly(true);
- orderedAnswersDefinition.setDescription(
- getI18NText("output.ordered.answers.for.question", false) + " " + question.getTitle());
- List conditions = new LinkedList();
+ orderedAnswersDefinition.setDescription(getI18NText("output.ordered.answers.for.question", false)
+ + " " + question.getQbQuestion().getName());
+ List conditions = new LinkedList<>();
orderedAnswersDefinition.setConditions(conditions);
int orderId = 1;
- for (AssessmentQuestionOption option : question.getOptions()) {
+ for (QbOption option : question.getQbQuestion().getQbOptions()) {
conditions.add(new BranchCondition(null, null, orderId++,
AssessmentConstants.OUTPUT_NAME_CONDITION_ORDERED_ANSWER + "#"
- + question.getSequenceId() + "#" + option.getSequenceId(),
- WebUtil.removeHTMLtags(option.getOptionString()), BranchCondition.OUTPUT_TYPE_LONG,
- null, null, null));
+ + question.getDisplayOrder() + "#" + option.getDisplayOrder(),
+ WebUtil.removeHTMLtags(option.getName()), BranchCondition.OUTPUT_TYPE_LONG, null, null,
+ null));
}
definitionMap.put(outputName, orderedAnswersDefinition);
}
@@ -144,7 +144,7 @@
public SortedMap getToolOutput(List names, IAssessmentService assessmentService,
Long toolSessionId, Long learnerId) {
- TreeMap output = new TreeMap();
+ TreeMap output = new TreeMap<>();
AssessmentSession session = assessmentService.getSessionBySessionId(toolSessionId);
if ((session != null) && (session.getAssessment() != null)) {
@@ -184,9 +184,9 @@
}
Set questions = assessment.getQuestions();
for (AssessmentQuestion question : questions) {
- if (names == null || names.contains(String.valueOf(question.getSequenceId()))) {
+ if (names == null || names.contains(String.valueOf(question.getDisplayOrder()))) {
output.put(AssessmentConstants.OUTPUT_NAME_LEARNER_NUMBER_ATTEMPTS,
- getQuestionScore(assessmentService, learnerId, assessment, question.getSequenceId()));
+ getQuestionScore(assessmentService, learnerId, assessment, question.getDisplayOrder()));
}
}
}
@@ -225,8 +225,9 @@
} else {
Set questions = assessment.getQuestions();
for (AssessmentQuestion question : questions) {
- if (name.equals(String.valueOf(question.getSequenceId()))) {
- return getQuestionScore(assessmentService, learnerId, assessment, question.getSequenceId());
+ if (name.equals(String.valueOf(question.getDisplayOrder()))) {
+ return getQuestionScore(assessmentService, learnerId, assessment,
+ question.getDisplayOrder());
}
}
}
@@ -265,11 +266,12 @@
Assessment assessment = assessmentService.getAssessmentByContentId(toolContentId);
Set questions = assessment.getQuestions();
for (AssessmentQuestion question : questions) {
- if (name.equals(String.valueOf(question.getSequenceId()))) {
+ if (name.equals(String.valueOf(question.getDisplayOrder()))) {
return null;
}
}
}
+
return null;
}
@@ -280,7 +282,7 @@
* @return
*/
private List convertToToolOutputs(List results) {
- List toolOutputs = new ArrayList();
+ List toolOutputs = new ArrayList<>();
for (AssessmentUserDTO result : results) {
float totalScore = result.getGrade();
@@ -365,12 +367,12 @@
* Get user's score for the question. Will always return a ToolOutput object.
*/
private ToolOutput getQuestionScore(IAssessmentService assessmentService, Long learnerId, Assessment assessment,
- int questionSequenceId) {
+ int questionDisplayOrder) {
Float questionResultMarkDB = assessmentService.getQuestionResultMark(assessment.getUid(), learnerId,
- questionSequenceId);
+ questionDisplayOrder);
float questionResultMark = (questionResultMarkDB == null) ? 0 : questionResultMarkDB;
- return new ToolOutput(String.valueOf(questionSequenceId), "description", questionResultMark);
+ return new ToolOutput(String.valueOf(questionDisplayOrder), "description", questionResultMark);
}
/**
@@ -385,23 +387,23 @@
AssessmentQuestion question = null;
// find question
for (AssessmentQuestion questionCandidate : assessment.getQuestions()) {
- if (questionSequenceId.equals(questionCandidate.getSequenceId())) {
+ if (questionSequenceId.equals(questionCandidate.getDisplayOrder())) {
question = questionCandidate;
break;
}
}
// find option
Long optionUid = null;
- for (AssessmentQuestionOption optionCandidate : question.getOptions()) {
- if (optionSequenceId.equals(optionCandidate.getSequenceId())) {
+ for (QbOption optionCandidate : question.getQbQuestion().getQbOptions()) {
+ if (optionSequenceId.equals(optionCandidate.getDisplayOrder())) {
optionUid = optionCandidate.getUid();
break;
}
}
// find order in which the given learner put the option
AssessmentResult result = assessmentService.getLastAssessmentResult(assessment.getUid(), learnerId);
for (AssessmentQuestionResult questionResult : result.getQuestionResults()) {
- if (questionResult.getAssessmentQuestion().getUid().equals(question.getUid())) {
+ if (questionResult.getQbToolQuestion().getUid().equals(question.getUid())) {
for (AssessmentOptionAnswer answer : questionResult.getOptionAnswers()) {
if (answer.getOptionUid().equals(optionUid)) {
return new ToolOutput(conditionName, null, answer.getAnswerInt());
Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java
===================================================================
diff -u -rd0031eadc1ee66ed82eade3ffa5c039016d999eb -r394f403c289f0fd7808c228840bead5c4e7d5d32
--- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision d0031eadc1ee66ed82eade3ffa5c039016d999eb)
+++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 394f403c289f0fd7808c228840bead5c4e7d5d32)
@@ -32,7 +32,6 @@
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
@@ -60,6 +59,10 @@
import org.lamsfoundation.lams.notebook.model.NotebookEntry;
import org.lamsfoundation.lams.notebook.service.CoreNotebookConstants;
import org.lamsfoundation.lams.notebook.service.ICoreNotebookService;
+import org.lamsfoundation.lams.qb.model.QbOption;
+import org.lamsfoundation.lams.qb.model.QbQuestion;
+import org.lamsfoundation.lams.qb.model.QbQuestionUnit;
+import org.lamsfoundation.lams.qb.service.IQbService;
import org.lamsfoundation.lams.rest.RestTags;
import org.lamsfoundation.lams.rest.ToolRestManager;
import org.lamsfoundation.lams.tool.ToolCompletionStatus;
@@ -88,16 +91,13 @@
import org.lamsfoundation.lams.tool.assessment.model.Assessment;
import org.lamsfoundation.lams.tool.assessment.model.AssessmentOptionAnswer;
import org.lamsfoundation.lams.tool.assessment.model.AssessmentQuestion;
-import org.lamsfoundation.lams.tool.assessment.model.AssessmentQuestionOption;
import org.lamsfoundation.lams.tool.assessment.model.AssessmentQuestionResult;
import org.lamsfoundation.lams.tool.assessment.model.AssessmentResult;
import org.lamsfoundation.lams.tool.assessment.model.AssessmentSession;
-import org.lamsfoundation.lams.tool.assessment.model.AssessmentUnit;
import org.lamsfoundation.lams.tool.assessment.model.AssessmentUser;
import org.lamsfoundation.lams.tool.assessment.model.QuestionReference;
import org.lamsfoundation.lams.tool.assessment.util.AnswerIntComparator;
import org.lamsfoundation.lams.tool.assessment.util.AssessmentEscapeUtils;
-import org.lamsfoundation.lams.tool.assessment.util.AssessmentQuestionResultComparator;
import org.lamsfoundation.lams.tool.assessment.util.AssessmentSessionComparator;
import org.lamsfoundation.lams.tool.assessment.util.SequencableComparator;
import org.lamsfoundation.lams.tool.exception.DataMissingException;
@@ -107,7 +107,6 @@
import org.lamsfoundation.lams.usermanagement.dto.UserDTO;
import org.lamsfoundation.lams.usermanagement.service.IUserManagementService;
import org.lamsfoundation.lams.util.ExcelCell;
-import org.lamsfoundation.lams.util.HashUtil;
import org.lamsfoundation.lams.util.JsonUtil;
import org.lamsfoundation.lams.util.MessageService;
import org.lamsfoundation.lams.util.NumberUtil;
@@ -159,6 +158,8 @@
private IEventNotificationService eventNotificationService;
+ private IQbService qbService;
+
// *******************************************************************************
// Service method
// *******************************************************************************
@@ -228,7 +229,7 @@
Set userQuestionResults = userResult.getQuestionResults();
for (AssessmentQuestionResult leaderQuestionResult : leaderQuestionResults) {
AssessmentQuestionResult userQuestionResult = new AssessmentQuestionResult();
- userQuestionResult.setAssessmentQuestion(leaderQuestionResult.getAssessmentQuestion());
+ userQuestionResult.setQbToolQuestion(leaderQuestionResult.getQbToolQuestion());
userQuestionResult.setAssessmentResult(userResult);
userQuestionResults.add(userQuestionResult);
@@ -253,13 +254,13 @@
Set userQuestionResults = userResult.getQuestionResults();
for (AssessmentQuestionResult leaderQuestionResult : leaderQuestionResults) {
for (AssessmentQuestionResult userQuestionResult : userQuestionResults) {
- if (userQuestionResult.getAssessmentQuestion().getUid()
- .equals(leaderQuestionResult.getAssessmentQuestion().getUid())) {
+ if (userQuestionResult.getQbToolQuestion().getUid()
+ .equals(leaderQuestionResult.getQbToolQuestion().getUid())) {
userQuestionResult.setAnswerString(leaderQuestionResult.getAnswerString());
userQuestionResult.setAnswerFloat(leaderQuestionResult.getAnswerFloat());
userQuestionResult.setAnswerBoolean(leaderQuestionResult.getAnswerBoolean());
- userQuestionResult.setSubmittedOptionUid(leaderQuestionResult.getSubmittedOptionUid());
+ userQuestionResult.setQbOption(leaderQuestionResult.getQbOption());
userQuestionResult.setMark(leaderQuestionResult.getMark());
userQuestionResult.setMaxMark(leaderQuestionResult.getMaxMark());
userQuestionResult.setPenalty(leaderQuestionResult.getPenalty());
@@ -415,10 +416,12 @@
@Override
public void saveOrUpdateAssessment(Assessment assessment) {
- //update questions' hashes in case questions' titles or descriptions got changed
- for (AssessmentQuestion question : (Set) assessment.getQuestions()) {
- String newHash = question.getQuestion() == null ? null : HashUtil.sha1(question.getQuestion());
- question.setQuestionHash(newHash);
+ for (AssessmentQuestion question : assessment.getQuestions()) {
+ //update only in case QbQuestion was modified, to prevent updating the same QbQuestions received from SesssionMap
+ if (question.getQbQuestionModified() != IQbService.QUESTION_MODIFIED_NONE) {
+ assessmentQuestionDao.saveObject(question.getQbQuestion());
+ }
+ assessmentQuestionDao.saveObject(question);
}
//store object in DB
@@ -427,28 +430,13 @@
@Override
public void updateAssessmentQuestion(AssessmentQuestion question) {
- //update question's hash in case question's title or description got changed
- String newHash = question.getQuestion() == null ? null : HashUtil.sha1(question.getQuestion());
- question.setQuestionHash(newHash);
-
- //store object in DB
assessmentQuestionDao.update(question);
}
@Override
public void releaseFromCache(Object object) {
assessmentDao.releaseFromCache(object);
- if (object instanceof AssessmentQuestion) {
- AssessmentQuestion question = (AssessmentQuestion) object;
- for (AssessmentQuestionOption option : question.getOptions()) {
- assessmentDao.releaseFromCache(option);
- }
- for (AssessmentUnit unit : question.getUnits()) {
- assessmentDao.releaseFromCache(unit);
- }
- }
-
if (object instanceof QuestionReference) {
QuestionReference reference = (QuestionReference) object;
if (reference.getQuestion() != null) {
@@ -504,14 +492,13 @@
//check all required questionResults exist, it can be missing in case of random question - create new one then
Set questionResults = lastResult.getQuestionResults();
- Set updatedQuestionResults = new TreeSet<>(
- new AssessmentQuestionResultComparator());
+ Set updatedQuestionResults = new TreeSet<>();
for (AssessmentQuestion question : questions) {
// get questionResult from DB instance of AssessmentResult
AssessmentQuestionResult questionResult = null;
for (AssessmentQuestionResult questionResultIter : questionResults) {
- if (question.getUid().equals(questionResultIter.getAssessmentQuestion().getUid())) {
+ if (question.getUid().equals(questionResultIter.getQbToolQuestion().getUid())) {
questionResult = questionResultIter;
}
}
@@ -555,20 +542,19 @@
*/
private AssessmentQuestionResult createQuestionResultObject(AssessmentQuestion question) {
AssessmentQuestionResult questionResult = new AssessmentQuestionResult();
- questionResult.setAssessmentQuestion(question);
+ questionResult.setQbToolQuestion(question);
// create optionAnswer for each option
Set optionAnswers = questionResult.getOptionAnswers();
- for (AssessmentQuestionOption option : question.getOptions()) {
+ for (QbOption option : question.getQbQuestion().getQbOptions()) {
AssessmentOptionAnswer optionAnswer = new AssessmentOptionAnswer();
optionAnswer.setOptionUid(option.getUid());
optionAnswers.add(optionAnswer);
}
return questionResult;
}
-
-
+
@Override
public void storeSingleMarkHedgingQuestion(Assessment assessment, Long userId,
List> pagedQuestions, Long singleMarkHedgingQuestionUid)
@@ -590,10 +576,10 @@
}
}
}
-
+
AssessmentQuestionResult questionResult = storeUserAnswer(result, questionDto);
questionResult.setFinishDate(new Date());
-
+
float mark = 0;
for (OptionDTO optionDto : questionDto.getOptionDtos()) {
if (optionDto.isCorrect()) {
@@ -604,9 +590,9 @@
}
}
questionResult.setMark(mark);
- questionResult.setMaxMark((float) questionDto.getGrade());
+ questionResult.setMaxMark((float) questionDto.getMaxMark());
assessmentResultDao.saveObject(questionResult);
-
+
//for displaying purposes calculate mark and set it to questionDto
questionDto.setMark(mark);
}
@@ -629,32 +615,32 @@
}
}
- // store grades and finished date only on user hitting submit all answers button (and not submit mark hedging
+ // store marks and finished date only on user hitting submit all answers button (and not submit mark hedging
// question)
if (!isAutosave) {
- int maximumGrade = 0;
- float grade = 0;
+ int maximumMark = 0;
+ float mark = 0;
- //sum up user grade and max grade for all questions
+ //sum up user mark and max mark for all questions
for (Set questionsForOnePage : pagedQuestions) {
for (QuestionDTO questionDto : questionsForOnePage) {
// get questionResult from DB instance of AssessmentResult
AssessmentQuestionResult questionResult = null;
for (AssessmentQuestionResult questionResultIter : result.getQuestionResults()) {
- if (questionDto.getUid().equals(questionResultIter.getAssessmentQuestion().getUid())) {
+ if (questionDto.getUid().equals(questionResultIter.getQbToolQuestion().getUid())) {
questionResult = questionResultIter;
}
}
calculateAnswerMark(assessment.getUid(), userId, questionResult, questionDto);
questionResult.setFinishDate(new Date());
-
- grade += questionResult.getMark();
- maximumGrade += questionDto.getGrade();
+
+ mark += questionResult.getMark();
+ maximumMark += questionDto.getMaxMark();
}
}
-
- result.setMaximumGrade(maximumGrade);
- result.setGrade(grade);
+
+ result.setMaximumGrade(maximumMark);
+ result.setGrade(mark);
result.setFinishDate(new Timestamp(new Date().getTime()));
assessmentResultDao.update(result);
}
@@ -672,7 +658,7 @@
// get questionResult from DB instance of AssessmentResult
AssessmentQuestionResult questionResult = null;
for (AssessmentQuestionResult questionResultIter : assessmentResult.getQuestionResults()) {
- if (questionDto.getUid().equals(questionResultIter.getAssessmentQuestion().getUid())) {
+ if (questionDto.getUid().equals(questionResultIter.getQbToolQuestion().getUid())) {
questionResult = questionResultIter;
}
}
@@ -703,7 +689,7 @@
// store option answer values
optionAnswer.setAnswerBoolean(optionDto.getAnswerBoolean());
optionAnswer.setAnswerInt(optionDto.getAnswerInt());
- if (questionDto.getType() == AssessmentConstants.QUESTION_TYPE_ORDERING) {
+ if (questionDto.getType() == QbQuestion.TYPE_ORDERING) {
optionAnswer.setAnswerInt(j++);
}
}
@@ -712,10 +698,10 @@
if (assessment.isEnableConfidenceLevels()) {
questionResult.setConfidenceLevel(questionDto.getConfidenceLevel());
}
-
+
return questionResult;
}
-
+
/**
*
* @return grade that user scored by answering that question
@@ -724,52 +710,52 @@
QuestionDTO questionDto) {
//calculate both mark and maxMark
float mark = 0;
- float maxMark = questionDto.getGrade();
- if (questionDto.getType() == AssessmentConstants.QUESTION_TYPE_MULTIPLE_CHOICE) {
+ float maxMark = questionDto.getMaxMark();
+ if (questionDto.getType() == QbQuestion.TYPE_MULTIPLE_CHOICE) {
boolean isMarkNullified = false;
- float totalGrade = 0;
+ float optionMaxMark = 0;
for (OptionDTO optionDto : questionDto.getOptionDtos()) {
if (optionDto.getAnswerBoolean()) {
- totalGrade += optionDto.getGrade();
- mark += optionDto.getGrade() * maxMark;
+ optionMaxMark += optionDto.getMaxMark();
+ mark += optionDto.getMaxMark() * maxMark;
// if option of "incorrect answer nullifies mark" is ON check if selected answer has a zero grade
// and if so nullify question's mark
- if (questionDto.isIncorrectAnswerNullifiesMark() && (optionDto.getGrade() == 0)) {
+ if (questionDto.isIncorrectAnswerNullifiesMark() && (optionDto.getMaxMark() == 0)) {
isMarkNullified = true;
}
}
}
- // set answerTotalGrade to let jsp know whether the question was answered correctly/partly/incorrectly even if mark=0
- questionDto.setAnswerTotalGrade(totalGrade);
+ // set optionMaxMark to let jsp know whether the question was answered correctly/partly/incorrectly even if mark=0
+ questionDto.setOptionMaxMark(optionMaxMark);
if (isMarkNullified) {
mark = 0;
}
- } else if (questionDto.getType() == AssessmentConstants.QUESTION_TYPE_MATCHING_PAIRS) {
+ } else if (questionDto.getType() == QbQuestion.TYPE_MATCHING_PAIRS) {
float maxMarkForCorrectAnswer = maxMark / questionDto.getOptionDtos().size();
for (OptionDTO optionDto : questionDto.getOptionDtos()) {
if (optionDto.getAnswerInt() == optionDto.getUid()) {
mark += maxMarkForCorrectAnswer;
}
}
- } else if (questionDto.getType() == AssessmentConstants.QUESTION_TYPE_SHORT_ANSWER) {
+ } else if (questionDto.getType() == QbQuestion.TYPE_SHORT_ANSWER) {
//clear previous answer
- questionResult.setSubmittedOptionUid(null);
+ questionResult.setQbOption(null);
for (OptionDTO optionDto : questionDto.getOptionDtos()) {
//prepare regex which takes into account only * special character
String regexWithOnlyAsteriskSymbolActive = "\\Q";
- String optionString = optionDto.getOptionString().trim();
- for (int i = 0; i < optionString.length(); i++) {
+ String name = optionDto.getName().trim();
+ for (int i = 0; i < name.length(); i++) {
//everything in between \\Q and \\E are taken literally no matter which characters it contains
- if (optionString.charAt(i) == '*') {
+ if (name.charAt(i) == '*') {
regexWithOnlyAsteriskSymbolActive += "\\E.*\\Q";
} else {
- regexWithOnlyAsteriskSymbolActive += optionString.charAt(i);
+ regexWithOnlyAsteriskSymbolActive += name.charAt(i);
}
}
regexWithOnlyAsteriskSymbolActive += "\\E";
@@ -787,39 +773,40 @@
: false;
if (isAnswerMatchedCurrentOption) {
- mark = optionDto.getGrade() * maxMark;
- questionResult.setSubmittedOptionUid(optionDto.getUid());
+ mark = optionDto.getMaxMark() * maxMark;
+ QbOption qbOption = qbService.getOptionByUid(optionDto.getUid());
+ questionResult.setQbOption(qbOption);
break;
}
}
- } else if (questionDto.getType() == AssessmentConstants.QUESTION_TYPE_NUMERICAL) {
+ } else if (questionDto.getType() == QbQuestion.TYPE_NUMERICAL) {
String answerString = questionDto.getAnswerString();
if (answerString != null) {
for (OptionDTO optionDto : questionDto.getOptionDtos()) {
boolean isAnswerMatchedCurrentOption = false;
try {
float answerFloat = Float.valueOf(questionDto.getAnswerString());
- isAnswerMatchedCurrentOption = ((answerFloat >= (optionDto.getOptionFloat()
+ isAnswerMatchedCurrentOption = ((answerFloat >= (optionDto.getNumericalOption()
- optionDto.getAcceptedError()))
- && (answerFloat <= (optionDto.getOptionFloat() + optionDto.getAcceptedError())));
+ && (answerFloat <= (optionDto.getNumericalOption() + optionDto.getAcceptedError())));
} catch (Exception e) {
}
if (!isAnswerMatchedCurrentOption) {
- for (AssessmentUnit unit : questionDto.getUnits()) {
- String regex = ".*" + unit.getUnit() + "$";
+ for (QbQuestionUnit unit : questionDto.getUnits()) {
+ String regex = ".*" + unit.getName() + "$";
Pattern pattern = Pattern.compile(regex,
java.util.regex.Pattern.CASE_INSENSITIVE | java.util.regex.Pattern.UNICODE_CASE);
if (pattern.matcher(answerString).matches()) {
String answerFloatStr = answerString.substring(0,
- answerString.length() - unit.getUnit().length());
+ answerString.length() - unit.getName().length());
try {
float answerFloat = Float.valueOf(answerFloatStr);
answerFloat = answerFloat / unit.getMultiplier();
- isAnswerMatchedCurrentOption = ((answerFloat >= (optionDto.getOptionFloat()
+ isAnswerMatchedCurrentOption = ((answerFloat >= (optionDto.getNumericalOption()
- optionDto.getAcceptedError()))
- && (answerFloat <= (optionDto.getOptionFloat()
+ && (answerFloat <= (optionDto.getNumericalOption()
+ optionDto.getAcceptedError())));
if (isAnswerMatchedCurrentOption) {
break;
@@ -830,23 +817,24 @@
}
}
if (isAnswerMatchedCurrentOption) {
- mark = optionDto.getGrade() * maxMark;
- questionResult.setSubmittedOptionUid(optionDto.getUid());
+ mark = optionDto.getMaxMark() * maxMark;
+ QbOption qbOption = qbService.getOptionByUid(optionDto.getUid());
+ questionResult.setQbOption(qbOption);
break;
}
}
}
- } else if (questionDto.getType() == AssessmentConstants.QUESTION_TYPE_TRUE_FALSE) {
+ } else if (questionDto.getType() == QbQuestion.TYPE_TRUE_FALSE) {
if ((questionDto.getAnswerBoolean() == questionDto.getCorrectAnswer())
&& (questionDto.getAnswerString() != null)) {
mark = maxMark;
}
- } else if (questionDto.getType() == AssessmentConstants.QUESTION_TYPE_ORDERING) {
+ } else if (questionDto.getType() == QbQuestion.TYPE_ORDERING) {
float maxMarkForCorrectAnswer = maxMark / questionDto.getOptionDtos().size();
- TreeSet correctOptionSet = new TreeSet<>(new SequencableComparator());
- Set originalOptions = questionResult.getAssessmentQuestion().getQuestionDTO().getOptionDtos();
+ TreeSet correctOptionSet = new TreeSet<>();
+ Set originalOptions = questionResult.getQuestionDto().getOptionDtos();
correctOptionSet.addAll(originalOptions);
ArrayList correctOptionList = new ArrayList<>(correctOptionSet);
int i = 0;
@@ -856,7 +844,7 @@
}
}
- } else if (questionDto.getType() == AssessmentConstants.QUESTION_TYPE_MARK_HEDGING) {
+ } else if (questionDto.getType() == QbQuestion.TYPE_MARK_HEDGING) {
for (OptionDTO optionDto : questionDto.getOptionDtos()) {
if (optionDto.isCorrect()) {
//if hedgingMark is a default '-1', change it to '0'
@@ -866,21 +854,21 @@
}
}
}
-
+
//total mark can't be more than maxMark
if (mark > maxMark) {
mark = maxMark;
- // in case options have negative grades (<0), their total mark can't be less than -maxMark
+ // in case options have negative marks (<0), their total mark can't be less than -maxMark
} else if (mark < -maxMark) {
mark = -maxMark;
}
// calculate penalty
if (mark > 0) {
// calculate number of wrong answers
- int numberWrongAnswers = assessmentQuestionResultDao.getNumberWrongAnswersDoneBefore(assessmentUid,
- userId, questionDto.getUid());
+ int numberWrongAnswers = assessmentQuestionResultDao.getNumberWrongAnswersDoneBefore(assessmentUid, userId,
+ questionDto.getUid());
// calculate penalty itself
float penalty = questionDto.getPenaltyFactor() * numberWrongAnswers;
@@ -899,7 +887,7 @@
questionResult.setMark(mark);
questionResult.setMaxMark(maxMark);
}
-
+
@Override
public void loadupLastAttempt(Long assessmentUid, Long userId, List> pagedQuestionDtos) {
//get the latest result (it can be unfinished one)
@@ -920,21 +908,21 @@
//load last finished results for hedging type of questions (in order to prevent retry)
Set questionResults = lastResult.getQuestionResults();
- if ((questionDto.getType() == AssessmentConstants.QUESTION_TYPE_MARK_HEDGING)
- && (lastResult.getFinishDate() == null) && (lastFinishedResult != null)) {
+ if ((questionDto.getType() == QbQuestion.TYPE_MARK_HEDGING) && (lastResult.getFinishDate() == null)
+ && (lastFinishedResult != null)) {
questionResults = lastFinishedResult.getQuestionResults();
}
for (AssessmentQuestionResult questionResult : questionResults) {
- if (questionDto.getUid().equals(questionResult.getAssessmentQuestion().getUid())) {
+ if (questionDto.getUid().equals(questionResult.getQbToolQuestion().getUid())) {
loadupQuestionResultIntoQuestionDto(questionDto, questionResult);
break;
}
}
}
}
}
-
+
/**
* Loads up all information from questionResult into questionDto.
*/
@@ -959,7 +947,7 @@
}
//sort ordering type of question in order to show how learner has sorted them
- if (questionDto.getType() == AssessmentConstants.QUESTION_TYPE_ORDERING) {
+ if (questionDto.getType() == QbQuestion.TYPE_ORDERING) {
//don't sort ordering type of questions that haven't been submitted to not break their shuffled order
boolean isOptionAnswersNeverSubmitted = true;
@@ -976,15 +964,15 @@
}
}
- // set answerTotalGrade to let jsp know whether the question was answered correctly/partly/incorrectly even if mark=0
- if (questionDto.getType() == AssessmentConstants.QUESTION_TYPE_MULTIPLE_CHOICE) {
- float totalGrade = 0;
+ // set optionMaxMark to let jsp know whether the question was answered correctly/partly/incorrectly even if mark=0
+ if (questionDto.getType() == QbQuestion.TYPE_MULTIPLE_CHOICE) {
+ float optionMaxMark = 0;
for (OptionDTO optionDto : questionDto.getOptionDtos()) {
if (optionDto.getAnswerBoolean()) {
- totalGrade += optionDto.getGrade();
+ optionMaxMark += optionDto.getMaxMark();
}
}
- questionDto.setAnswerTotalGrade(totalGrade);
+ questionDto.setOptionMaxMark(optionMaxMark);
}
}
@@ -1074,7 +1062,7 @@
public int getAssessmentResultCount(Long assessmentUid, Long userId) {
return assessmentResultDao.getAssessmentResultCount(assessmentUid, userId);
}
-
+
@Override
public boolean isAssessmentAttempted(Long assessmentUid) {
return assessmentResultDao.isAssessmentAttempted(assessmentUid);
@@ -1091,8 +1079,8 @@
}
@Override
- public Float getQuestionResultMark(Long assessmentUid, Long userId, int questionSequenceId) {
- return assessmentQuestionResultDao.getQuestionResultMark(assessmentUid, userId, questionSequenceId);
+ public Float getQuestionResultMark(Long assessmentUid, Long userId, int questionDisplayOrder) {
+ return assessmentQuestionResultDao.getQuestionResultMark(assessmentUid, userId, questionDisplayOrder);
}
@Override
@@ -1233,8 +1221,7 @@
Set questionResults = lastFinishedResult.getQuestionResults();
//prepare list of the questions to display in user master detail table, filtering out questions that aren't supposed to be answered
- SortedSet questionResultsToDisplay = new TreeSet<>(
- new AssessmentQuestionResultComparator());
+ SortedSet questionResultsToDisplay = new TreeSet<>();
//in case there is at least one random question - we need to show all questions
if (assessment.hasRandomQuestion()) {
questionResultsToDisplay.addAll(questionResults);
@@ -1243,7 +1230,7 @@
} else {
for (QuestionReference reference : questionReferences) {
for (AssessmentQuestionResult questionResult : questionResults) {
- if (reference.getQuestion().getUid().equals(questionResult.getAssessmentQuestion().getUid())) {
+ if (reference.getQuestion().getUid().equals(questionResult.getQbToolQuestion().getUid())) {
questionResultsToDisplay.add(questionResult);
}
}
@@ -1288,7 +1275,7 @@
//otherwise show only questions from the question list
} else {
- for (QuestionReference reference : (Set) assessment.getQuestionReferences()) {
+ for (QuestionReference reference : assessment.getQuestionReferences()) {
questions.add(reference.getQuestion());
}
}
@@ -1302,7 +1289,7 @@
List questionResults = new ArrayList<>();
for (AssessmentResult result : results) {
for (AssessmentQuestionResult questionResult : result.getQuestionResults()) {
- if (question.getUid().equals(questionResult.getAssessmentQuestion().getUid())) {
+ if (question.getUid().equals(questionResult.getQbToolQuestion().getUid())) {
// for displaying purposes only (no saving occurs)
questionResult.setFinishDate(result.getFinishDate());
@@ -1325,11 +1312,9 @@
@Override
public QuestionSummary getQuestionSummary(Long contentId, Long questionUid) {
- QuestionSummary questionSummary = new QuestionSummary();
AssessmentQuestion question = assessmentQuestionDao.getByUid(questionUid);
- questionSummary.setQuestion(question);
- return questionSummary;
+ return new QuestionSummary(question);
}
@Override
@@ -1369,10 +1354,9 @@
sessionIdToUsersMap.put(sessionId, users);
}
- for (AssessmentQuestion question : (Set) assessment.getQuestions()) {
+ for (AssessmentQuestion question : assessment.getQuestions()) {
Long questionUid = question.getUid();
- QuestionSummary questionSummary = new QuestionSummary();
- questionSummary.setQuestion(question);
+ QuestionSummary questionSummary = new QuestionSummary(question);
List> questionResults = new ArrayList<>();
@@ -1387,10 +1371,10 @@
AssessmentQuestionResult questionResult = null;
if (assessmentResult == null) {
questionResult = new AssessmentQuestionResult();
- questionResult.setAssessmentQuestion(question);
+ questionResult.setQbToolQuestion(question);
} else {
for (AssessmentQuestionResult dbQuestionResult : assessmentResult.getQuestionResults()) {
- if (dbQuestionResult.getAssessmentQuestion().getUid().equals(questionUid)) {
+ if (dbQuestionResult.getQbToolQuestion().getUid().equals(questionUid)) {
questionResult = dbQuestionResult;
break;
}
@@ -1612,10 +1596,10 @@
questionSummaryTab.add(questionTitle);
// set up the summary table data for the top of the question area.
- boolean doSummaryTable = question.getType() == AssessmentConstants.QUESTION_TYPE_MULTIPLE_CHOICE
- || question.getType() == AssessmentConstants.QUESTION_TYPE_SHORT_ANSWER
- || question.getType() == AssessmentConstants.QUESTION_TYPE_NUMERICAL
- || question.getType() == AssessmentConstants.QUESTION_TYPE_TRUE_FALSE;
+ boolean doSummaryTable = question.getType() == QbQuestion.TYPE_MULTIPLE_CHOICE
+ || question.getType() == QbQuestion.TYPE_SHORT_ANSWER
+ || question.getType() == QbQuestion.TYPE_NUMERICAL
+ || question.getType() == QbQuestion.TYPE_TRUE_FALSE;
// For MC, Numeric & Short Answer Key is optionUid, Value is number of answers
// For True/False Key 0 is false and Key 1 is true
Map summaryOfAnswers = new HashMap<>();
@@ -1629,9 +1613,9 @@
ArrayList questionSummaryTabTemp = new ArrayList<>();
//add question title row
- if (question.getType() == AssessmentConstants.QUESTION_TYPE_MARK_HEDGING) {
+ if (question.getType() == QbQuestion.TYPE_MARK_HEDGING) {
count = 0;
- Set options = question.getOptions();
+ List options = question.getQbQuestion().getQbOptions();
colsNum += options.size() - 1;
// question row title
ExcelCell[] hedgeQuestionTitleRow = new ExcelCell[colsNum];
@@ -1649,9 +1633,9 @@
getMessage("label.monitoring.user.summary.user.name"), true);
}
hedgeQuestionTitleRow[count++] = new ExcelCell(getMessage("label.export.date.attempted"), true);
- for (AssessmentQuestionOption option : options) {
- hedgeQuestionTitleRow[count++] = new ExcelCell(
- option.getOptionString().replaceAll("\\<.*?\\>", ""), true);
+ for (QbOption option : options) {
+ hedgeQuestionTitleRow[count++] = new ExcelCell(option.getName().replaceAll("\\<.*?\\>", ""),
+ true);
if (option.isCorrect()) {
hedgeQuestionTitleRow[count - 1].setColor(IndexedColors.GREEN);
}
@@ -1677,12 +1661,12 @@
ExcelCell[] userResultRow = new ExcelCell[colsNum];
count = 0;
- userResultRow[count++] = new ExcelCell(questionResult.getAssessmentQuestion().getTitle(),
+ userResultRow[count++] = new ExcelCell(questionResult.getQbQuestion().getName(), false);
+ userResultRow[count++] = new ExcelCell(
+ AssessmentServiceImpl.getQuestionTypeLabel(questionResult.getQbQuestion().getType()),
false);
userResultRow[count++] = new ExcelCell(
- getQuestionTypeLanguageLabel(questionResult.getAssessmentQuestion().getType()), false);
- userResultRow[count++] = new ExcelCell(
- Float.valueOf(questionResult.getAssessmentQuestion().getPenaltyFactor()), false);
+ Float.valueOf(questionResult.getQbQuestion().getPenaltyFactor()), false);
Float maxMark = (questionResult.getMaxMark() == null) ? 0
: Float.valueOf(questionResult.getMaxMark());
userResultRow[count++] = new ExcelCell(maxMark, false);
@@ -1694,10 +1678,10 @@
}
userResultRow[count++] = new ExcelCell(questionResult.getFinishDate(), false);
//answer
- if (question.getType() == AssessmentConstants.QUESTION_TYPE_MARK_HEDGING) {
+ if (question.getType() == QbQuestion.TYPE_MARK_HEDGING) {
Set optionAnswers = questionResult.getOptionAnswers();
- for (AssessmentQuestionOption option : question.getOptions()) {
+ for (QbOption option : question.getQbQuestion().getQbOptions()) {
for (AssessmentOptionAnswer optionAnswer : optionAnswers) {
if (option.getUid().equals(optionAnswer.getOptionUid())) {
userResultRow[count++] = new ExcelCell(optionAnswer.getAnswerInt(), false);
@@ -1830,9 +1814,9 @@
} else {
AssessmentQuestion question = questionReference.getQuestion();
- title = question.getTitle();
- questionType = getQuestionTypeLanguageLabel(question.getType());
- penaltyFactor = question.getPenaltyFactor();
+ title = question.getQbQuestion().getName();
+ questionType = AssessmentServiceImpl.getQuestionTypeLabel(question.getType());
+ penaltyFactor = question.getQbQuestion().getPenaltyFactor();
QuestionSummary questionSummary = questionSummaries.get(question.getUid());
if (questionSummary != null) {
@@ -1841,7 +1825,7 @@
}
}
- int maxGrade = questionReference.getDefaultGrade();
+ int maxGrade = questionReference.getMaxMark();
totalGradesPossible += maxGrade;
ExcelCell[] questCell = new ExcelCell[5];
@@ -1924,8 +1908,8 @@
userResultRow[0] = new ExcelCell(assessmentUser.getLoginName(), false);
userResultRow[1] = new ExcelCell(assessmentUser.getFullName(), false);
userResultRow[2] = new ExcelCell(assessmentResult.getStartDate(), false);
- userResultRow[3] = new ExcelCell(
- questionResult.getAssessmentQuestion().getTitle(), false);
+ userResultRow[3] = new ExcelCell(questionResult.getQbQuestion().getName(),
+ false);
userResultRow[4] = new ExcelCell(
AssessmentEscapeUtils.printResponsesForExcelExport(questionResult),
false);
@@ -1935,8 +1919,8 @@
ExcelCell[] userResultRow = new ExcelCell[5];
userResultRow[0] = new ExcelCell(assessmentUser.getUserId(), false);
userResultRow[1] = new ExcelCell(assessmentResult.getStartDate(), false);
- userResultRow[2] = new ExcelCell(
- questionResult.getAssessmentQuestion().getTitle(), false);
+ userResultRow[2] = new ExcelCell(questionResult.getQbQuestion().getName(),
+ false);
userResultRow[3] = new ExcelCell(
AssessmentEscapeUtils.printResponsesForExcelExport(questionResult),
false);
@@ -1973,23 +1957,23 @@
Long trueKey, Long falseKey) {
ExcelCell[] summaryTable;
int i = 0;
- if (question.getType() == AssessmentConstants.QUESTION_TYPE_MULTIPLE_CHOICE
- || question.getType() == AssessmentConstants.QUESTION_TYPE_SHORT_ANSWER
- || question.getType() == AssessmentConstants.QUESTION_TYPE_NUMERICAL) {
- summaryTable = new ExcelCell[question.getOptions().size() + 1];
- for (AssessmentQuestionOption option : question.getOptions()) {
+ if (question.getType() == QbQuestion.TYPE_MULTIPLE_CHOICE || question.getType() == QbQuestion.TYPE_SHORT_ANSWER
+ || question.getType() == QbQuestion.TYPE_NUMERICAL) {
+ List options = question.getQbQuestion().getQbOptions();
+ summaryTable = new ExcelCell[options.size() + 1];
+ for (QbOption option : options) {
summaryOfAnswers.put(option.getUid(), 0);
StringBuilder bldr = new StringBuilder(getMessage("label.authoring.basic.option.answer")).append(" ")
.append(i + 1).append(" - ");
- if (question.getType() == AssessmentConstants.QUESTION_TYPE_NUMERICAL) {
- bldr.append(option.getOptionFloat()).append(" +- ").append(option.getAcceptedError());
+ if (question.getType() == QbQuestion.TYPE_NUMERICAL) {
+ bldr.append(option.getNumericalOption()).append(" +- ").append(option.getAcceptedError());
} else {
- bldr.append(option.getOptionString().replaceAll("\\<.*?\\>", ""));
+ bldr.append(option.getName().replaceAll("\\<.*?\\>", ""));
}
summaryTable[i] = new ExcelCell(bldr.toString(), false);
i++;
}
- if (question.getType() == AssessmentConstants.QUESTION_TYPE_MULTIPLE_CHOICE) {
+ if (question.getType() == QbQuestion.TYPE_MULTIPLE_CHOICE) {
summaryTable[i++] = new ExcelCell(getMessage("label.not.answered"), false);
} else {
summaryTable[i++] = new ExcelCell(getMessage("label.other"), false);
@@ -2007,7 +1991,7 @@
private Integer updateSummaryCounts(AssessmentQuestion question, AssessmentQuestionResult questionResult,
Map summaryOfAnswers, Integer summaryNACount) {
- if (question.getType() == AssessmentConstants.QUESTION_TYPE_MULTIPLE_CHOICE) {
+ if (question.getType() == QbQuestion.TYPE_MULTIPLE_CHOICE) {
boolean foundOption = false;
Set optionAnswers = questionResult.getOptionAnswers();
if (optionAnswers != null) {
@@ -2029,23 +2013,24 @@
if (!foundOption) {
summaryNACount++;
}
- } else if (question.getType() == AssessmentConstants.QUESTION_TYPE_SHORT_ANSWER
- || question.getType() == AssessmentConstants.QUESTION_TYPE_NUMERICAL) {
- Long submittedUid = questionResult.getSubmittedOptionUid();
- if (submittedUid != null) {
- Integer currentCount = summaryOfAnswers.get(submittedUid);
+ } else if (question.getType() == QbQuestion.TYPE_SHORT_ANSWER
+ || question.getType() == QbQuestion.TYPE_NUMERICAL) {
+ Long submittedOptionUid = questionResult.getQbOption() == null ? null
+ : questionResult.getQbOption().getUid();
+ if (submittedOptionUid != null) {
+ Integer currentCount = summaryOfAnswers.get(submittedOptionUid);
if (currentCount == null) {
log.error(
"Assessment Export: Unable to count answer in summary, refers to an unexpected option. QuestionResult "
- + questionResult.getUid() + " submittedOptionUid " + submittedUid + " question "
+ + questionResult.getUid() + " chosen optionUid " + submittedOptionUid + " question "
+ question.getUid());
} else {
- summaryOfAnswers.put(submittedUid, currentCount + 1);
+ summaryOfAnswers.put(submittedOptionUid, currentCount + 1);
}
} else {
summaryNACount++;
}
- } else if (question.getType() == AssessmentConstants.QUESTION_TYPE_TRUE_FALSE) {
+ } else if (question.getType() == QbQuestion.TYPE_TRUE_FALSE) {
if (questionResult.getAnswerString() == null) {
summaryNACount++;
} else {
@@ -2070,12 +2055,11 @@
total += value;
}
int i = 0;
- if (question.getType() == AssessmentConstants.QUESTION_TYPE_MULTIPLE_CHOICE
- || question.getType() == AssessmentConstants.QUESTION_TYPE_SHORT_ANSWER
- || question.getType() == AssessmentConstants.QUESTION_TYPE_NUMERICAL) {
- for (AssessmentQuestionOption option : question.getOptions()) {
+ if (question.getType() == QbQuestion.TYPE_MULTIPLE_CHOICE || question.getType() == QbQuestion.TYPE_SHORT_ANSWER
+ || question.getType() == QbQuestion.TYPE_NUMERICAL) {
+ for (QbOption option : question.getQbQuestion().getQbOptions()) {
summaryTable[i] = new ExcelCell(valueAsPercentage(summaryOfAnswers.get(option.getUid()), total), false);
- if (option.getGrade() > 0) {
+ if (option.getMaxMark() > 0) {
summaryTable[i].setColor(IndexedColors.GREEN);
}
i++;
@@ -2086,31 +2070,31 @@
summaryTable[0] = new ExcelCell(valueAsPercentage(summaryOfAnswers.get(trueKey), total), false);
summaryTable[1] = new ExcelCell(valueAsPercentage(summaryOfAnswers.get(falseKey), total), false);
summaryTable[2] = new ExcelCell(valueAsPercentage(summaryNACount, total), false);
- summaryTable[question.getCorrectAnswer() ? 0 : 1].setColor(IndexedColors.GREEN);
+ summaryTable[question.getQbQuestion().getCorrectAnswer() ? 0 : 1].setColor(IndexedColors.GREEN);
}
return summaryTable;
}
/**
* Used only for excell export (for getUserSummaryData() method).
*/
- private String getQuestionTypeLanguageLabel(short type) {
+ public static String getQuestionTypeLabel(Integer type) {
switch (type) {
- case AssessmentConstants.QUESTION_TYPE_ESSAY:
+ case QbQuestion.TYPE_ESSAY:
return "Essay";
- case AssessmentConstants.QUESTION_TYPE_MATCHING_PAIRS:
+ case QbQuestion.TYPE_MATCHING_PAIRS:
return "Matching Pairs";
- case AssessmentConstants.QUESTION_TYPE_MULTIPLE_CHOICE:
+ case QbQuestion.TYPE_MULTIPLE_CHOICE:
return "Multiple Choice";
- case AssessmentConstants.QUESTION_TYPE_NUMERICAL:
+ case QbQuestion.TYPE_NUMERICAL:
return "Numerical";
- case AssessmentConstants.QUESTION_TYPE_ORDERING:
+ case QbQuestion.TYPE_ORDERING:
return "Ordering";
- case AssessmentConstants.QUESTION_TYPE_SHORT_ANSWER:
+ case QbQuestion.TYPE_SHORT_ANSWER:
return "Short Answer";
- case AssessmentConstants.QUESTION_TYPE_TRUE_FALSE:
+ case QbQuestion.TYPE_TRUE_FALSE:
return "True/False";
- case AssessmentConstants.QUESTION_TYPE_MARK_HEDGING:
+ case QbQuestion.TYPE_MARK_HEDGING:
return "Mark Hedging";
default:
return null;
@@ -2119,15 +2103,15 @@
@Override
public void changeQuestionResultMark(Long questionResultUid, float newMark) {
- AssessmentQuestionResult questionAnswer = assessmentQuestionResultDao
+ AssessmentQuestionResult questionResult = assessmentQuestionResultDao
.getAssessmentQuestionResultByUid(questionResultUid);
- float oldMark = questionAnswer.getMark();
- AssessmentResult assessmentResult = questionAnswer.getAssessmentResult();
- float totalMark = (assessmentResult.getGrade() - oldMark) + newMark;
+ float oldMark = questionResult.getMark();
+ AssessmentResult assessmentResult = questionResult.getAssessmentResult();
+ float assessmentMark = (assessmentResult.getGrade() - oldMark) + newMark;
Long toolSessionId = assessmentResult.getSessionId();
Assessment assessment = assessmentResult.getAssessment();
- Long questionUid = questionAnswer.getAssessmentQuestion().getUid();
+ Long questionUid = questionResult.getQbToolQuestion().getUid();
// When changing a mark for user and isUseSelectLeaderToolOuput is true, the mark should be propagated to all
// students within the group
@@ -2159,15 +2143,16 @@
assessmentQuestionResultDao.saveObject(lastAssessmentQuestionResult);
AssessmentResult result = lastAssessmentQuestionResult.getAssessmentResult();
- result.setGrade(totalMark);
+ result.setGrade(assessmentMark);
assessmentResultDao.saveObject(result);
// propagade changes to Gradebook
- toolService.updateActivityMark(Double.valueOf(totalMark), null, userId.intValue(), toolSessionId, false);
+ toolService.updateActivityMark(Double.valueOf(assessmentMark), null, userId.intValue(), toolSessionId,
+ false);
// records mark change with audit service
logEventService.logMarkChange(userId, user.getLoginName(), assessment.getContentId(), "" + oldMark,
- "" + totalMark);
+ "" + assessmentMark);
}
}
@@ -2181,9 +2166,9 @@
// create list of modified questions
List modifiedQuestions = new ArrayList<>();
for (AssessmentQuestion oldQuestion : oldQuestions) {
-
- if (AssessmentConstants.QUESTION_TYPE_ESSAY == oldQuestion.getType()
- || AssessmentConstants.QUESTION_TYPE_MATCHING_PAIRS == oldQuestion.getType()) {
+
+ if (QbQuestion.TYPE_ESSAY == oldQuestion.getType()
+ || QbQuestion.TYPE_MATCHING_PAIRS == oldQuestion.getType()) {
continue;
}
@@ -2193,31 +2178,31 @@
boolean isQuestionModified = false;
// title or question is different - do nothing. Also question grade can't be changed
-
- //AssessmentConstants.QUESTION_TYPE_TRUE_FALSE
- if (oldQuestion.getCorrectAnswer() != newQuestion.getCorrectAnswer()) {
+
+ //QbQuestion.TYPE_TRUE_FALSE
+ if (oldQuestion.getQbQuestion().getCorrectAnswer() != newQuestion.getQbQuestion()
+ .getCorrectAnswer()) {
isQuestionModified = true;
}
// options are different
- Set oldOptions = oldQuestion.getOptions();
- Set newOptions = newQuestion.getOptions();
- for (AssessmentQuestionOption oldOption : oldOptions) {
- for (AssessmentQuestionOption newOption : newOptions) {
+ List oldOptions = oldQuestion.getQbQuestion().getQbOptions();
+ List newOptions = newQuestion.getQbQuestion().getQbOptions();
+ for (QbOption oldOption : oldOptions) {
+ for (QbOption newOption : newOptions) {
if (oldOption.getUid().equals(newOption.getUid())) {
//ordering
- if (((oldQuestion.getType() == AssessmentConstants.QUESTION_TYPE_ORDERING)
- && (oldOption.getSequenceId() != newOption.getSequenceId()))
+ if (((oldQuestion.getType() == QbQuestion.TYPE_ORDERING)
+ && (oldOption.getDisplayOrder() != newOption.getDisplayOrder()))
//short answer
- || ((oldQuestion.getType() == AssessmentConstants.QUESTION_TYPE_SHORT_ANSWER)
- && !StringUtils.equals(oldOption.getOptionString(),
- newOption.getOptionString()))
+ || ((oldQuestion.getType() == QbQuestion.TYPE_SHORT_ANSWER)
+ && !StringUtils.equals(oldOption.getName(), newOption.getName()))
//numbering
- || (oldOption.getOptionFloat() != newOption.getOptionFloat())
+ || (oldOption.getNumericalOption() != newOption.getNumericalOption())
|| (oldOption.getAcceptedError() != newOption.getAcceptedError())
//option grade
- || (oldOption.getGrade() != newOption.getGrade())
+ || (oldOption.getMaxMark() != newOption.getMaxMark())
//changed correct option
|| (oldOption.isCorrect() != newOption.isCorrect())) {
isQuestionModified = true;
@@ -2237,13 +2222,13 @@
}
// create list of references with modified grades.
- // modifiedReferences holds pairs newReference -> oldReference.getDefaultGrade()
+ // modifiedReferences holds pairs newReference -> oldReference.getMaxMark()
Map modifiedReferences = new HashMap<>();
for (QuestionReference oldReference : oldReferences) {
for (QuestionReference newReference : newReferences) {
if (oldReference.getUid().equals(newReference.getUid())
- && (oldReference.getDefaultGrade() != newReference.getDefaultGrade())) {
- modifiedReferences.put(newReference, oldReference.getDefaultGrade());
+ && (oldReference.getMaxMark() != newReference.getMaxMark())) {
+ modifiedReferences.put(newReference, oldReference.getMaxMark());
}
}
}
@@ -2272,50 +2257,49 @@
float assessmentMark = assessmentResult.getGrade();
int assessmentMaxMark = assessmentResult.getMaximumGrade();
Set questionResults = assessmentResult.getQuestionResults();
-
+
// [+] if the question is modified
for (AssessmentQuestionResult questionResult : questionResults) {
- AssessmentQuestion question = questionResult.getAssessmentQuestion();
+ QuestionDTO questionDto = new QuestionDTO(questionResult.getQbToolQuestion());
//check whether according question was modified
for (AssessmentQuestion modifiedQuestion : modifiedQuestions) {
- if (question.getUid().equals(modifiedQuestion.getUid())) {
+ if (questionDto.getUid().equals(modifiedQuestion.getUid())) {
Float oldQuestionAnswerMark = questionResult.getMark();
//actually recalculate marks
- QuestionDTO questionDto = question.getQuestionDTO();
- questionDto.setGrade(questionResult.getMaxMark().intValue());
+ questionDto.setMaxMark(questionResult.getMaxMark().intValue());
loadupQuestionResultIntoQuestionDto(questionDto, questionResult);
calculateAnswerMark(assessmentUid, user.getUserId(), questionResult, questionDto);
assessmentQuestionResultDao.saveObject(questionResult);
-
+
float newQuestionAnswerMark = questionResult.getMark();
assessmentMark += newQuestionAnswerMark - oldQuestionAnswerMark;
break;
}
}
}
-
+
// [+] if the question reference mark is modified
- for (AssessmentQuestionResult questionResult:questionResults) {
- Long questionUid = questionResult.getAssessmentQuestion().getUid();
-
+ for (AssessmentQuestionResult questionResult : questionResults) {
+ Long questionUid = questionResult.getQbToolQuestion().getUid();
+
for (QuestionReference modifiedReference : modifiedReferences.keySet()) {
if (!modifiedReference.isRandomQuestion()
&& questionUid.equals(modifiedReference.getQuestion().getUid())) {
- int newReferenceGrade = modifiedReference.getDefaultGrade();
- int oldReferenceGrade = modifiedReferences.get(modifiedReference);
+ int newReferenceMaxMark = modifiedReference.getMaxMark();
+ int oldReferenceMaxMark = modifiedReferences.get(modifiedReference);
// update question answer's mark
Float oldQuestionAnswerMark = questionResult.getMark();
- float newQuestionAnswerMark = (oldQuestionAnswerMark * newReferenceGrade)
- / oldReferenceGrade;
+ float newQuestionAnswerMark = (oldQuestionAnswerMark * newReferenceMaxMark)
+ / oldReferenceMaxMark;
questionResult.setMark(newQuestionAnswerMark);
- questionResult.setMaxMark((float) newReferenceGrade);
+ questionResult.setMaxMark((float) newReferenceMaxMark);
assessmentQuestionResultDao.saveObject(questionResult);
assessmentMark += newQuestionAnswerMark - oldQuestionAnswerMark;
- assessmentMaxMark += newReferenceGrade - oldReferenceGrade;
+ assessmentMaxMark += newReferenceMaxMark - oldReferenceMaxMark;
break;
}
}
@@ -2325,7 +2309,7 @@
ArrayList nonRandomQuestionResults = new ArrayList<>();
for (AssessmentQuestionResult questionResult : questionResults) {
for (QuestionReference reference : newReferences) {
- if (!reference.isRandomQuestion() && questionResult.getAssessmentQuestion().getUid()
+ if (!reference.isRandomQuestion() && questionResult.getQbToolQuestion().getUid()
.equals(reference.getQuestion().getUid())) {
nonRandomQuestionResults.add(questionResult);
}
@@ -2337,27 +2321,27 @@
// [+] if the question reference mark is modified (in case of random question references)
for (QuestionReference modifiedReference : modifiedReferences.keySet()) {
- // in case of random question reference - search for the answer with the same maxmark (it does not matter to which random reference this question belong originally as the only thing that differentiate those references is defaultGrade)
+ // in case of random question reference - search for the answer with the same maxmark (it does not matter to which random reference this question belong originally as the only thing that differentiate those references is maxMark)
if (modifiedReference.isRandomQuestion()) {
for (AssessmentQuestionResult randomQuestionResult : randomQuestionResults) {
- int newReferenceGrade = modifiedReference.getDefaultGrade();
- int oldReferenceGrade = modifiedReferences.get(modifiedReference);
+ int newReferenceMaxMark = modifiedReference.getMaxMark();
+ int oldReferenceMaxMark = modifiedReferences.get(modifiedReference);
- if (randomQuestionResult.getMaxMark().intValue() == oldReferenceGrade) {
+ if (randomQuestionResult.getMaxMark().intValue() == oldReferenceMaxMark) {
// update question answer's mark
Float oldQuestionResultMark = randomQuestionResult.getMark();
- float newQuestionResultMark = (oldQuestionResultMark * newReferenceGrade)
- / oldReferenceGrade;
+ float newQuestionResultMark = (oldQuestionResultMark * newReferenceMaxMark)
+ / oldReferenceMaxMark;
randomQuestionResult.setMark(newQuestionResultMark);
- randomQuestionResult.setMaxMark((float) newReferenceGrade);
+ randomQuestionResult.setMaxMark((float) newReferenceMaxMark);
assessmentQuestionResultDao.saveObject(randomQuestionResult);
nonRandomQuestionResults.add(randomQuestionResult);
assessmentMark += newQuestionResultMark - oldQuestionResultMark;
- assessmentMaxMark += newReferenceGrade - oldReferenceGrade;
+ assessmentMaxMark += newReferenceMaxMark - oldReferenceMaxMark;
break;
}
}
@@ -2406,7 +2390,7 @@
public void auditLogStartEditingActivityInMonitor(long toolContentID) {
toolService.auditLogStartEditingActivityInMonitor(toolContentID);
}
-
+
@Override
public boolean isLastActivity(Long toolSessionId) {
return toolService.isLastActivity(toolSessionId);
@@ -2622,8 +2606,7 @@
// reset it to new toolContentId
toolContentObj.setContentId(toolContentId);
- AssessmentUser user = assessmentUserDao.getUserCreatedAssessment(newUserUid.longValue(),
- toolContentId);
+ AssessmentUser user = assessmentUserDao.getUserCreatedAssessment(newUserUid.longValue(), toolContentId);
if (user == null) {
user = new AssessmentUser();
UserDTO sysUser = ((User) userManagementService.findById(User.class, newUserUid)).getUserDTO();
@@ -2806,7 +2789,7 @@
@Override
public List getConfidenceLevels(Long toolSessionId) {
- List confidenceLevelDtos = new ArrayList();
+ List confidenceLevelDtos = new ArrayList<>();
if (toolSessionId == null) {
return confidenceLevelDtos;
}
@@ -2825,44 +2808,45 @@
//fill in question's and user answer's hashes
for (AssessmentQuestionResult questionResult : assessmentResult.getQuestionResults()) {
- AssessmentQuestion question = questionResult.getAssessmentQuestion();
+ QbQuestion qbQuestion = questionResult.getQbQuestion();
- List answers = new LinkedList();
+ List answers = new LinkedList<>();
+ List optionUids = new LinkedList<>();
- if (question.getType() == AssessmentConstants.QUESTION_TYPE_MULTIPLE_CHOICE) {
+ if (qbQuestion.getType() == QbQuestion.TYPE_MULTIPLE_CHOICE) {
- for (AssessmentQuestionOption option : question.getOptions()) {
+ for (QbOption option : qbQuestion.getQbOptions()) {
for (AssessmentOptionAnswer optionAnswer : questionResult.getOptionAnswers()) {
if (optionAnswer.getAnswerBoolean()
&& (optionAnswer.getOptionUid().equals(option.getUid()))) {
- answers.add(option.getOptionString());
+ optionUids.add(option.getUid());
}
}
}
- } else if (question.getType() == AssessmentConstants.QUESTION_TYPE_MATCHING_PAIRS) {
+ } else if (qbQuestion.getType() == QbQuestion.TYPE_MATCHING_PAIRS) {
- } else if (question.getType() == AssessmentConstants.QUESTION_TYPE_SHORT_ANSWER) {
+ } else if (qbQuestion.getType() == QbQuestion.TYPE_SHORT_ANSWER) {
answers.add(questionResult.getAnswerString());
- } else if (question.getType() == AssessmentConstants.QUESTION_TYPE_NUMERICAL) {
+ } else if (qbQuestion.getType() == QbQuestion.TYPE_NUMERICAL) {
answers.add(questionResult.getAnswerString());
- } else if (question.getType() == AssessmentConstants.QUESTION_TYPE_TRUE_FALSE) {
+ } else if (qbQuestion.getType() == QbQuestion.TYPE_TRUE_FALSE) {
if (questionResult.getAnswerString() != null) {
answers.add("" + questionResult.getAnswerBoolean());
}
- } else if (question.getType() == AssessmentConstants.QUESTION_TYPE_ESSAY) {
+ } else if (qbQuestion.getType() == QbQuestion.TYPE_ESSAY) {
answers.add(questionResult.getAnswerString());
- } else if (question.getType() == AssessmentConstants.QUESTION_TYPE_ORDERING) {
+ } else if (qbQuestion.getType() == QbQuestion.TYPE_ORDERING) {
- } else if (question.getType() == AssessmentConstants.QUESTION_TYPE_MARK_HEDGING) {
+ } else if (qbQuestion.getType() == QbQuestion.TYPE_MARK_HEDGING) {
}
- for (String answer : answers) {
+ for (Long optionUid : optionUids) {
ConfidenceLevelDTO confidenceLevelDto = new ConfidenceLevelDTO();
confidenceLevelDto.setUserId(user.getUserId().intValue());
String userName = StringUtils.isBlank(user.getFirstName())
@@ -2871,11 +2855,21 @@
confidenceLevelDto.setUserName(userName);
confidenceLevelDto.setPortraitUuid(portraitUuid);
confidenceLevelDto.setLevel(questionResult.getConfidenceLevel());
- confidenceLevelDto.setQuestion(question.getQuestion());
- confidenceLevelDto.setAnswer(answer);
+ confidenceLevelDto.setQbQuestionUid(qbQuestion.getUid());
+ confidenceLevelDto.setQbOptionUid(optionUid);
confidenceLevelDtos.add(confidenceLevelDto);
}
+ for (String answer : answers) {
+// ConfidenceLevelDTO confidenceLevelDto = new ConfidenceLevelDTO();
+// confidenceLevelDto.setUserId(userId.intValue());
+// confidenceLevelDto.setPortraitUuid(portraitUuid);
+// confidenceLevelDto.setLevel(questionResult.getConfidenceLevel());
+// confidenceLevelDto.setQbQuestionUid(qbQuestion.getUid());
+// confidenceLevelDto.setQbOptionUid(optionUid);
+//
+// confidenceLevelDtos.add(confidenceLevelDto);
+ }
}
}
@@ -2963,6 +2957,10 @@
this.eventNotificationService = eventNotificationService;
}
+ public void setQbService(IQbService qbService) {
+ this.qbService = qbService;
+ }
+
public AssessmentOutputFactory getAssessmentOutputFactory() {
return assessmentOutputFactory;
}
@@ -3022,7 +3020,7 @@
* "answerFloat", "displayOrder" (Integer), "grade" (Integer).
*
* The references entry should be a ArrayNode containing JSON objects, which in turn must contain "displayOrder"
- * (Integer), "questionDisplayOrder" (Integer - to match to the question). It may also have "defaultGrade" (Integer)
+ * (Integer), "questionDisplayOrder" (Integer - to match to the question). It may also have "maxMark" (Integer)
* and "randomQuestion" (Boolean)
*
* @throws IOException
@@ -3090,57 +3088,60 @@
Set newQuestionSet = assessment.getQuestions(); // the Assessment constructor will set up the collection
for (JsonNode questionJSONData : questions) {
AssessmentQuestion question = new AssessmentQuestion();
- short type = JsonUtil.optInt(questionJSONData, "type").shortValue();
- question.setType(type);
- question.setTitle(questionJSONData.get(RestTags.QUESTION_TITLE).asText());
- question.setQuestion(questionJSONData.get(RestTags.QUESTION_TEXT).asText());
- question.setSequenceId(JsonUtil.optInt(questionJSONData, RestTags.DISPLAY_ORDER));
+ Integer type = JsonUtil.optInt(questionJSONData, "type");
+ question.getQbQuestion().setType(type);
+ question.getQbQuestion().setName(questionJSONData.get(RestTags.QUESTION_TITLE).asText());
+ question.getQbQuestion().setDescription(questionJSONData.get(RestTags.QUESTION_TEXT).asText());
+ question.setDisplayOrder(JsonUtil.optInt(questionJSONData, RestTags.DISPLAY_ORDER));
- question.setAllowRichEditor(
+ question.getQbQuestion().setAllowRichEditor(
JsonUtil.optBoolean(questionJSONData, RestTags.ALLOW_RICH_TEXT_EDITOR, Boolean.FALSE));
- question.setAnswerRequired(JsonUtil.optBoolean(questionJSONData, "answerRequired", Boolean.FALSE));
- question.setCaseSensitive(JsonUtil.optBoolean(questionJSONData, "caseSensitive", Boolean.FALSE));
- question.setCorrectAnswer(JsonUtil.optBoolean(questionJSONData, "correctAnswer", Boolean.FALSE));
- question.setDefaultGrade(JsonUtil.optInt(questionJSONData, "defaultGrade", 1));
- question.setFeedback(JsonUtil.optString(questionJSONData, "feedback"));
- question.setFeedbackOnCorrect(JsonUtil.optString(questionJSONData, "feedbackOnCorrect"));
- question.setFeedbackOnIncorrect(JsonUtil.optString(questionJSONData, "feedbackOnIncorrect"));
- question.setFeedbackOnPartiallyCorrect(JsonUtil.optString(questionJSONData, "feedbackOnPartiallyCorrect"));
- question.setGeneralFeedback(JsonUtil.optString(questionJSONData, "generalFeedback", ""));
- question.setMaxWordsLimit(JsonUtil.optInt(questionJSONData, "maxWordsLimit", 0));
- question.setMinWordsLimit(JsonUtil.optInt(questionJSONData, "minWordsLimit", 0));
- question.setMultipleAnswersAllowed(
+ question.getQbQuestion()
+ .setAnswerRequired(JsonUtil.optBoolean(questionJSONData, "answerRequired", Boolean.FALSE));
+ question.getQbQuestion()
+ .setCaseSensitive(JsonUtil.optBoolean(questionJSONData, "caseSensitive", Boolean.FALSE));
+ question.getQbQuestion()
+ .setCorrectAnswer(JsonUtil.optBoolean(questionJSONData, "correctAnswer", Boolean.FALSE));
+ question.getQbQuestion().setMaxMark(JsonUtil.optInt(questionJSONData, "maxMark", 1));
+ question.getQbQuestion().setFeedback(JsonUtil.optString(questionJSONData, "feedback"));
+ question.getQbQuestion().setFeedbackOnCorrect(JsonUtil.optString(questionJSONData, "feedbackOnCorrect"));
+ question.getQbQuestion()
+ .setFeedbackOnIncorrect(JsonUtil.optString(questionJSONData, "feedbackOnIncorrect"));
+ question.getQbQuestion()
+ .setFeedbackOnPartiallyCorrect(JsonUtil.optString(questionJSONData, "feedbackOnPartiallyCorrect"));
+ question.getQbQuestion().setMaxWordsLimit(JsonUtil.optInt(questionJSONData, "maxWordsLimit", 0));
+ question.getQbQuestion().setMinWordsLimit(JsonUtil.optInt(questionJSONData, "minWordsLimit", 0));
+ question.getQbQuestion().setMultipleAnswersAllowed(
JsonUtil.optBoolean(questionJSONData, "multipleAnswersAllowed", Boolean.FALSE));
- question.setIncorrectAnswerNullifiesMark(
+ question.getQbQuestion().setIncorrectAnswerNullifiesMark(
JsonUtil.optBoolean(questionJSONData, "incorrectAnswerNullifiesMark", Boolean.FALSE));
- question.setPenaltyFactor(JsonUtil.optDouble(questionJSONData, "penaltyFactor", 0.0).floatValue());
+ question.getQbQuestion()
+ .setPenaltyFactor(JsonUtil.optDouble(questionJSONData, "penaltyFactor", 0.0).floatValue());
// question.setUnits(units); Needed for numerical type question
- if ((type == AssessmentConstants.QUESTION_TYPE_MATCHING_PAIRS)
- || (type == AssessmentConstants.QUESTION_TYPE_MULTIPLE_CHOICE)
- || (type == AssessmentConstants.QUESTION_TYPE_NUMERICAL)
- || (type == AssessmentConstants.QUESTION_TYPE_MARK_HEDGING)) {
+ if ((type == QbQuestion.TYPE_MATCHING_PAIRS) || (type == QbQuestion.TYPE_MULTIPLE_CHOICE)
+ || (type == QbQuestion.TYPE_NUMERICAL) || (type == QbQuestion.TYPE_MARK_HEDGING)) {
if (!questionJSONData.has(RestTags.ANSWERS)) {
throw new IOException("REST Authoring is missing answers for a question of type " + type + ". Data:"
+ toolContentJSON);
}
- Set optionList = new LinkedHashSet<>();
+ List optionList = new ArrayList<>();
ArrayNode optionsData = JsonUtil.optArray(questionJSONData, RestTags.ANSWERS);
for (JsonNode answerData : optionsData) {
- AssessmentQuestionOption option = new AssessmentQuestionOption();
- option.setSequenceId(JsonUtil.optInt(answerData, RestTags.DISPLAY_ORDER));
- option.setGrade(answerData.get("grade").floatValue());
+ QbOption option = new QbOption();
+ option.setDisplayOrder(JsonUtil.optInt(answerData, RestTags.DISPLAY_ORDER));
+ option.setMaxMark(answerData.get("maxMark").floatValue());
option.setCorrect(JsonUtil.optBoolean(answerData, "correct", false));
option.setAcceptedError(JsonUtil.optDouble(answerData, "acceptedError", 0.0).floatValue());
option.setFeedback(JsonUtil.optString(answerData, "feedback"));
- option.setOptionString(JsonUtil.optString(answerData, RestTags.ANSWER_TEXT));
- option.setOptionFloat(JsonUtil.optDouble(answerData, "answerFloat", 0.0).floatValue());
+ option.setName(JsonUtil.optString(answerData, RestTags.ANSWER_TEXT));
+ option.setNumericalOption(JsonUtil.optDouble(answerData, "answerFloat", 0.0).floatValue());
// option.setQuestion(question); can't find the use for this field yet!
optionList.add(option);
}
- question.setOptions(optionList);
+ question.getQbQuestion().setQbOptions(optionList);
}
checkType(question.getType());
@@ -3155,7 +3156,7 @@
for (JsonNode referenceJSONData : references) {
QuestionReference reference = new QuestionReference();
reference.setType((short) 0);
- reference.setDefaultGrade(JsonUtil.optInt(referenceJSONData, "defaultGrade", 1));
+ reference.setMaxMark(JsonUtil.optInt(referenceJSONData, "maxMark", 1));
reference.setSequenceId(JsonUtil.optInt(referenceJSONData, RestTags.DISPLAY_ORDER));
AssessmentQuestion matchingQuestion = matchQuestion(newQuestionSet,
JsonUtil.optInt(referenceJSONData, "questionDisplayOrder"));
@@ -3177,7 +3178,7 @@
AssessmentQuestion matchQuestion(Set newReferenceSet, Integer displayOrder) {
if (displayOrder != null) {
for (AssessmentQuestion question : newReferenceSet) {
- if (displayOrder.equals(question.getSequenceId())) {
+ if (displayOrder.equals(question.getDisplayOrder())) {
return question;
}
}
@@ -3186,9 +3187,8 @@
}
// TODO Implement REST support for all types and then remove checkType method
- void checkType(short type) throws IOException {
- if ((type != AssessmentConstants.QUESTION_TYPE_ESSAY)
- && (type != AssessmentConstants.QUESTION_TYPE_MULTIPLE_CHOICE)) {
+ void checkType(Integer type) throws IOException {
+ if ((type != QbQuestion.TYPE_ESSAY) && (type != QbQuestion.TYPE_MULTIPLE_CHOICE)) {
throw new IOException(
"Assessment Tool does not support REST Authoring for anything but Essay Type and Multiple Choice. Found type "
+ type);
@@ -3208,7 +3208,7 @@
@Override
public void notifyLearnersOnAnswerDisclose(long toolContentId) {
List sessions = assessmentSessionDao.getByContentId(toolContentId);
- Set userIds = new HashSet();
+ Set userIds = new HashSet<>();
for (AssessmentSession session : sessions) {
for (AssessmentUser user : session.getAssessmentUsers()) {
userIds.add(user.getUserId().intValue());
Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/LearningController.java
===================================================================
diff -u -r8518d9067746b5286f01a9ed5679a8b60cff0e95 -r394f403c289f0fd7808c228840bead5c4e7d5d32
--- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/LearningController.java (.../LearningController.java) (revision 8518d9067746b5286f01a9ed5679a8b60cff0e95)
+++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/LearningController.java (.../LearningController.java) (revision 394f403c289f0fd7808c228840bead5c4e7d5d32)
@@ -48,9 +48,9 @@
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
-import org.apache.commons.lang.math.NumberUtils;
import org.apache.log4j.Logger;
import org.lamsfoundation.lams.notebook.model.NotebookEntry;
+import org.lamsfoundation.lams.qb.model.QbQuestion;
import org.lamsfoundation.lams.tool.ToolAccessMode;
import org.lamsfoundation.lams.tool.assessment.AssessmentConstants;
import org.lamsfoundation.lams.tool.assessment.dto.OptionDTO;
@@ -289,7 +289,7 @@
AssessmentQuestion question = questionToReferenceMap.get(questionReference.getUid());
QuestionDTO questionDto = question.getQuestionDTO();
- questionDto.setGrade(questionReference.getDefaultGrade());
+ questionDto.setMaxMark(questionReference.getMaxMark());
questionDtos.add(questionDto);
}
@@ -301,33 +301,33 @@
questionDtos = new LinkedList<>(shuffledList);
}
for (QuestionDTO questionDto : questionDtos) {
- if (questionDto.isShuffle() || (questionDto.getType() == AssessmentConstants.QUESTION_TYPE_ORDERING)) {
+ if (questionDto.isShuffle() || (questionDto.getType() == QbQuestion.TYPE_ORDERING)) {
ArrayList shuffledList = new ArrayList<>(questionDto.getOptionDtos());
Collections.shuffle(shuffledList);
questionDto.setOptionDtos(new LinkedHashSet<>(shuffledList));
}
- if (questionDto.getType() == AssessmentConstants.QUESTION_TYPE_MATCHING_PAIRS) {
+ if (questionDto.getType() == QbQuestion.TYPE_MATCHING_PAIRS) {
//sort answer options alphanumerically (as per LDEV-4326)
- ArrayList optionsSortedByOptionString = new ArrayList<>(questionDto.getOptionDtos());
- optionsSortedByOptionString.sort(new Comparator() {
+ ArrayList optionsSortedByName = new ArrayList<>(questionDto.getOptionDtos());
+ optionsSortedByName.sort(new Comparator() {
@Override
public int compare(OptionDTO o1, OptionDTO o2) {
- String optionString1 = o1.getOptionString() != null ? o1.getOptionString() : "";
- String optionString2 = o2.getOptionString() != null ? o2.getOptionString() : "";
+ String name1 = o1.getName() != null ? o1.getName() : "";
+ String name2 = o2.getName() != null ? o2.getName() : "";
- return AlphanumComparator.compareAlphnumerically(optionString1, optionString2);
+ return AlphanumComparator.compareAlphnumerically(name1, name2);
}
});
- questionDto.setMatchingPairOptions(new LinkedHashSet<>(optionsSortedByOptionString));
+ questionDto.setMatchingPairOptions(new LinkedHashSet<>(optionsSortedByName));
}
}
//paging
- List> pagedQuestionDtos = new ArrayList>();
+ List> pagedQuestionDtos = new ArrayList<>();
int maxQuestionsPerPage = ((assessment.getQuestionsPerPage() != 0) && hasEditRight)
? assessment.getQuestionsPerPage()
: questionDtos.size();
- LinkedHashSet questionsForOnePage = new LinkedHashSet();
+ LinkedHashSet questionsForOnePage = new LinkedHashSet<>();
pagedQuestionDtos.add(questionsForOnePage);
int count = 0;
for (QuestionDTO questionDto : questionDtos) {
@@ -761,16 +761,16 @@
}
int questionType = questionDto.getType();
- if (questionType == AssessmentConstants.QUESTION_TYPE_MULTIPLE_CHOICE) {
+ if (questionType == QbQuestion.TYPE_MULTIPLE_CHOICE) {
for (OptionDTO optionDto : questionDto.getOptionDtos()) {
boolean answerBoolean = false;
if (questionDto.isMultipleAnswersAllowed()) {
- String answerString = request.getParameter(
- AssessmentConstants.ATTR_QUESTION_PREFIX + i + "_" + optionDto.getUid());
+ String answerString = request
+ .getParameter(AssessmentConstants.ATTR_QUESTION_PREFIX + i + "_" + optionDto.getUid());
answerBoolean = !StringUtils.isBlank(answerString);
-
} else {
- String optionUidSelectedStr = request.getParameter(AssessmentConstants.ATTR_QUESTION_PREFIX + i);
+ String optionUidSelectedStr = request
+ .getParameter(AssessmentConstants.ATTR_QUESTION_PREFIX + i);
if (optionUidSelectedStr != null) {
Long optionUidSelected = Long.parseLong(optionUidSelectedStr);
answerBoolean = optionDto.getUid().equals(optionUidSelected);
@@ -779,45 +779,45 @@
optionDto.setAnswerBoolean(answerBoolean);
}
- } else if (questionType == AssessmentConstants.QUESTION_TYPE_MATCHING_PAIRS) {
+ } else if (questionType == QbQuestion.TYPE_MATCHING_PAIRS) {
for (OptionDTO optionDto : questionDto.getOptionDtos()) {
int answerInt = WebUtil.readIntParam(request,
AssessmentConstants.ATTR_QUESTION_PREFIX + i + "_" + optionDto.getUid());
optionDto.setAnswerInt(answerInt);
}
- } else if (questionType == AssessmentConstants.QUESTION_TYPE_SHORT_ANSWER) {
+ } else if (questionType == QbQuestion.TYPE_SHORT_ANSWER) {
String answerString = request.getParameter(AssessmentConstants.ATTR_QUESTION_PREFIX + i);
questionDto.setAnswerString(answerString);
- } else if (questionType == AssessmentConstants.QUESTION_TYPE_NUMERICAL) {
+ } else if (questionType == QbQuestion.TYPE_NUMERICAL) {
String answerString = request.getParameter(AssessmentConstants.ATTR_QUESTION_PREFIX + i);
questionDto.setAnswerString(answerString);
- } else if (questionType == AssessmentConstants.QUESTION_TYPE_TRUE_FALSE) {
+ } else if (questionType == QbQuestion.TYPE_TRUE_FALSE) {
String answerString = request.getParameter(AssessmentConstants.ATTR_QUESTION_PREFIX + i);
if (answerString != null) {
questionDto.setAnswerBoolean(Boolean.parseBoolean(answerString));
questionDto.setAnswerString("answered");
}
- } else if (questionType == AssessmentConstants.QUESTION_TYPE_ESSAY) {
+ } else if (questionType == QbQuestion.TYPE_ESSAY) {
String answerString = request.getParameter(AssessmentConstants.ATTR_QUESTION_PREFIX + i);
answerString = answerString.replaceAll("[\n\r\f]", "");
questionDto.setAnswerString(answerString);
- } else if (questionType == AssessmentConstants.QUESTION_TYPE_ORDERING) {
+ } else if (questionType == QbQuestion.TYPE_ORDERING) {
for (OptionDTO optionDto : questionDto.getOptionDtos()) {
int answerSequenceId = WebUtil.readIntParam(request,
AssessmentConstants.ATTR_QUESTION_PREFIX + i + "_" + optionDto.getUid());
- optionDto.setSequenceId(answerSequenceId);
+ optionDto.setDisplayOrder(answerSequenceId);
}
//sort accrording to the new sequenceIds
- Set sortedOptions = new TreeSet<>(new SequencableComparator());
+ Set sortedOptions = new TreeSet<>();
sortedOptions.addAll(questionDto.getOptionDtos());
questionDto.setOptionDtos(sortedOptions);
- } else if (questionType == AssessmentConstants.QUESTION_TYPE_MARK_HEDGING) {
+ } else if (questionType == QbQuestion.TYPE_MARK_HEDGING) {
//store hedging marks
for (OptionDTO optionDto : questionDto.getOptionDtos()) {
@@ -871,39 +871,38 @@
int questionType = questionDto.getType();
//enforce all hedging marks question type to be answered as well
- if (questionDto.isAnswerRequired()
- || (questionType == AssessmentConstants.QUESTION_TYPE_MARK_HEDGING)) {
+ if (questionDto.isAnswerRequired() || (questionType == QbQuestion.TYPE_MARK_HEDGING)) {
boolean isAnswered = false;
- if (questionType == AssessmentConstants.QUESTION_TYPE_MULTIPLE_CHOICE) {
+ if (questionType == QbQuestion.TYPE_MULTIPLE_CHOICE) {
for (OptionDTO optionDto : questionDto.getOptionDtos()) {
isAnswered |= optionDto.getAnswerBoolean();
}
- } else if (questionType == AssessmentConstants.QUESTION_TYPE_MATCHING_PAIRS) {
+ } else if (questionType == QbQuestion.TYPE_MATCHING_PAIRS) {
for (OptionDTO optionDto : questionDto.getOptionDtos()) {
isAnswered |= optionDto.getAnswerInt() != 0;
}
- } else if ((questionType == AssessmentConstants.QUESTION_TYPE_SHORT_ANSWER)
- || (questionType == AssessmentConstants.QUESTION_TYPE_NUMERICAL)
- || (questionType == AssessmentConstants.QUESTION_TYPE_TRUE_FALSE)
- || (questionType == AssessmentConstants.QUESTION_TYPE_ESSAY)) {
+ } else if ((questionType == QbQuestion.TYPE_SHORT_ANSWER)
+ || (questionType == QbQuestion.TYPE_NUMERICAL)
+ || (questionType == QbQuestion.TYPE_TRUE_FALSE)
+ || (questionType == QbQuestion.TYPE_ESSAY)) {
isAnswered |= StringUtils.isNotBlank(questionDto.getAnswerString());
- } else if (questionType == AssessmentConstants.QUESTION_TYPE_ORDERING) {
+ } else if (questionType == QbQuestion.TYPE_ORDERING) {
isAnswered = true;
- } else if (questionType == AssessmentConstants.QUESTION_TYPE_MARK_HEDGING) {
+ } else if (questionType == QbQuestion.TYPE_MARK_HEDGING) {
- //verify sum of all hedging marks is equal to question's grade
+ //verify sum of all hedging marks is equal to question's maxMark
int sumMarkHedging = 0;
for (OptionDTO optionDto : questionDto.getOptionDtos()) {
sumMarkHedging += optionDto.getAnswerInt();
}
- isAnswered = sumMarkHedging == questionDto.getGrade();
+ isAnswered = sumMarkHedging == questionDto.getMaxMark();
//verify justification of hedging is provided if it was enabled
if (questionDto.isHedgingJustificationEnabled()) {
@@ -919,8 +918,7 @@
}
- if ((questionDto.getType() == AssessmentConstants.QUESTION_TYPE_ESSAY)
- && (questionDto.getMinWordsLimit() > 0)) {
+ if ((questionDto.getType() == QbQuestion.TYPE_ESSAY) && (questionDto.getMinWordsLimit() > 0)) {
if (questionDto.getAnswerString() == null) {
isAllQuestionsReachedMinWordsLimit = false;
@@ -970,30 +968,35 @@
// find corresponding questionResult
for (AssessmentQuestionResult questionResult : result.getQuestionResults()) {
- if (questionDto.getUid().equals(questionResult.getAssessmentQuestion().getUid())) {
+ if (questionDto.getUid().equals(questionResult.getQbToolQuestion().getUid())) {
// copy questionResult's info to the question
questionDto.setMark(questionResult.getMark());
questionDto.setResponseSubmitted(questionResult.getFinishDate() != null);
questionDto.setPenalty(questionResult.getPenalty());
questionDto.setQuestionFeedback(null);
- for (OptionDTO optionDto : questionDto.getOptionDtos()) {
- if (optionDto.getUid().equals(questionResult.getSubmittedOptionUid())) {
- questionDto.setQuestionFeedback(optionDto.getFeedback());
- break;
+ questionDto.setAnswerBoolean(false);
+
+ if ((questionDto.getType() == QbQuestion.TYPE_SHORT_ANSWER
+ || questionDto.getType() == QbQuestion.TYPE_NUMERICAL)
+ && questionResult.getQbOption() != null) {
+
+ // required for showing right/wrong answers icons on results page correctly
+ for (OptionDTO optionDto : questionDto.getOptionDtos()) {
+ if (optionDto.getUid().equals(questionResult.getQbOption().getUid())) {
+ boolean isAnsweredCorrectly = optionDto.getMaxMark() > 0;
+ questionDto.setAnswerBoolean(isAnsweredCorrectly);
+ break;
+ }
}
- }
- // required for showing right/wrong answers icons on results page correctly
- if (questionDto.getType() == AssessmentConstants.QUESTION_TYPE_SHORT_ANSWER
- || questionDto.getType() == AssessmentConstants.QUESTION_TYPE_NUMERICAL) {
- boolean isAnsweredCorrectly = false;
+
+ //question feedback
for (OptionDTO optionDto : questionDto.getOptionDtos()) {
- if (optionDto.getUid().equals(questionResult.getSubmittedOptionUid())) {
- isAnsweredCorrectly = optionDto.getGrade() > 0;
+ if (optionDto.getUid().equals(questionResult.getQbOption().getUid())) {
+ questionDto.setQuestionFeedback(optionDto.getFeedback());
break;
}
}
- questionDto.setAnswerBoolean(isAnsweredCorrectly);
}
// required for markandpenalty area and if it's on - on question's summary page
@@ -1010,7 +1013,7 @@
result.setTimeTaken(timeTaken);
if (assessment.isAllowOverallFeedbackAfterQuestion()) {
int percentageCorrectAnswers = (int) (result.getGrade() * 100 / result.getMaximumGrade());
- ArrayList overallFeedbacks = new ArrayList(
+ ArrayList overallFeedbacks = new ArrayList<>(
assessment.getOverallFeedbacks());
int lastBorder = 0;
for (int i = overallFeedbacks.size() - 1; i >= 0; i--) {
@@ -1035,7 +1038,7 @@
// if answers are going to be disclosed, prepare data for the table in results page
if (assessment.isAllowDiscloseAnswers()) {
// such entities should not go into session map, but as request attributes instead
- SortedSet sessions = new TreeSet(
+ SortedSet sessions = new TreeSet<>(
new AssessmentSessionComparator());
sessions.addAll(service.getSessionsByContentId(assessment.getContentId()));
request.setAttribute("sessions", sessions);
Index: lams_tool_assessment/web/includes/css/assessment.scss
===================================================================
diff -u -r51d4ec0a2ce479984ec5daf54c9a29029309428f -r394f403c289f0fd7808c228840bead5c4e7d5d32
--- lams_tool_assessment/web/includes/css/assessment.scss (.../assessment.scss) (revision 51d4ec0a2ce479984ec5daf54c9a29029309428f)
+++ lams_tool_assessment/web/includes/css/assessment.scss (.../assessment.scss) (revision 394f403c289f0fd7808c228840bead5c4e7d5d32)
@@ -1,10 +1,5 @@
@import "_lams_variables.scss";
-#overall-feedback {
- margin-left: 23px;
- margin-top: 10px;
-}
-
.innerforms {
border: 0px;
font-size: small;
Index: lams_tool_assessment/web/pages/learning/learning.jsp
===================================================================
diff -u -r8518d9067746b5286f01a9ed5679a8b60cff0e95 -r394f403c289f0fd7808c228840bead5c4e7d5d32
--- lams_tool_assessment/web/pages/learning/learning.jsp (.../learning.jsp) (revision 8518d9067746b5286f01a9ed5679a8b60cff0e95)
+++ lams_tool_assessment/web/pages/learning/learning.jsp (.../learning.jsp) (revision 394f403c289f0fd7808c228840bead5c4e7d5d32)
@@ -45,18 +45,18 @@
var questionIndex = $(this).data("question-index");
var selects = $("select[name^=question" + questionIndex + "_]");
- var grade = selects.length == 0 ? 0 : eval(selects.first().find('option:last-child').val())
+ var maxMark = selects.length == 0 ? 0 : eval(selects.first().find('option:last-child').val())
var totalSelected = countHedgeQuestionSelectTotal(questionIndex);
- var isButtonEnabled = (totalSelected == grade);
+ var isButtonEnabled = (totalSelected == maxMark);
//check if hedging justification is enabled
var justificationTextarea = $("#justification-question" + questionIndex);
if( justificationTextarea.length) {
isButtonEnabled = isButtonEnabled && $.trim(justificationTextarea.val());
}
- //if totalSelected equals to question's grade - show button
+ //if totalSelected equals to question's maxMark - show button
if (isButtonEnabled) {
$("[type=button][name=submit-hedging-question" + questionIndex + "]").prop("disabled", "").removeClass("button-disabled");
} else {
@@ -385,11 +385,11 @@
}
} else {
- var grade = ${question.grade};
+ var maxMark = ${question.maxMark};
var totalSelected = countHedgeQuestionSelectTotal(questionIndex);
- //if totalSelected not equals to question's grade OR textarea is empty or contains only white-space - show warning
- if (totalSelected != grade) {
+ //if totalSelected not equals to question's maxMark OR textarea is empty or contains only white-space - show warning
+ if (totalSelected != maxMark) {
markHedgingWrongTotalQuestions.push("${status.index}");
}
if(${question.hedgingJustificationEnabled} && !$.trim($("#justification-question" + questionIndex).val())){
Index: lams_tool_assessment/web/pages/learning/parts/markhedging.jsp
===================================================================
diff -u -r8518d9067746b5286f01a9ed5679a8b60cff0e95 -r394f403c289f0fd7808c228840bead5c4e7d5d32
--- lams_tool_assessment/web/pages/learning/parts/markhedging.jsp (.../markhedging.jsp) (revision 8518d9067746b5286f01a9ed5679a8b60cff0e95)
+++ lams_tool_assessment/web/pages/learning/parts/markhedging.jsp (.../markhedging.jsp) (revision 394f403c289f0fd7808c228840bead5c4e7d5d32)
@@ -2,7 +2,7 @@
Index: lams_tool_lamc/conf/language/lams/ApplicationResources.properties
===================================================================
diff -u -r298ac30bd04d6cdffdbbc42d1ceec29831809dc7 -r394f403c289f0fd7808c228840bead5c4e7d5d32
--- lams_tool_lamc/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 298ac30bd04d6cdffdbbc42d1ceec29831809dc7)
+++ lams_tool_lamc/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 394f403c289f0fd7808c228840bead5c4e7d5d32)
@@ -1,241 +1,247 @@
-appName = mcq
-#language code: en
-#locale code: AU
-
- # Exported from the LAMS Community by Ernie Ghiglione on Sun Mar 24 18:02:01 CST 2019
-
-#=================== labels for Multiple Choice Questions =================#
-
-activity.title =Multiple Choice
-activity.description =Creates automated assessment questions. e.g. Multiple choice and true/false questions. Can provide feedback and scores.
-activity.helptext =Learner answers a series of automated assessment questions. e.g. Multiple choice and true/false questions. Optional features include feedback on each question and scoring. Questions are weighted for scoring.
-tool.display.name =Multiple Choice Tool
-tool.description =Tool for learners to answer a series of automated assessment questions.
-label.tool.shortname =MCQ
-label.basic =Basic
-label.advanced =Advanced
-label.summary =Summary
-label.stats =Stats
-label.editActivity =Edit Activity
-label.authoring =MCQ Authoring
-label.learning =MCQ Learning
-label.monitoring =MCQ Monitoring
-label.authoring.title =Title
-label.authoring.instructions =Instructions
-label.Questions =Questions
-label.addNewQuestion =Add new question
-label.moveDown =Down
-label.add.question =Add New
-label.add.option =Add New
-label.mc.options.col =Candidate answers:
-label.learner.message =You can only proceed to the activity after you have reached the passing mark
-label.viewAnswers =Summary of responses
-label.topMark =Top mark:
-label.avMark =Average mark:
-label.loMark =Lowest mark:
-count.total.user =Total users count:
-label.mark =Mark:
-label.redo.questions =Redo questions
-label.view =View
-label.finished =Next Activity
-button.submit =Submit
-button.continue =Continue
-label.isCorrect =Correct?
-label.question.only =Question
-label.question =Question
-radiobox.passmark =Pass mark
-radiobox.onepq =One question per page
-radiobox.retries =Allow retries
-option.correct =Correct
-label.outof =out of
-label.save =Save
-label.cancel =Cancel
-feedback =Please address the following issues before submit.
-error.passMark.empty =Please correct this: Pass mark can not be empty.
-options.count.zero =Please correct this: There must be at least one candidate answer.
-error.passmark.notInteger =Please correct this: Pass mark can only be an integer.
-error.file.notPersisted =An error occurred: The file is not viewable yet. Please save all the content first and check back.
-error.fileName.empty =Please correct this: Under "Instructions", the file(name) to upload can not be empty.
-error.questions.withNoOptions =Please note: The questions with no candidate answers have been automatically removed for you. Please check total question weight.
-error.answers.empty =Please correct this: Candidate answers can not be empty.
-error.passMark.greater100 =Please correct this: The passmark can not be greater than 100%
-error.question.addNotAllowed.thisScreen =The question text can not be modified in this screen since it has options attached . Please use the "Options" button to edit the question text.
-error.question.removeNotAllowed.thisScreen =The question can not be removed since one or more of the question texts has been modified. Please try again without any text modifications.
-error.selectedIndex.empty =Can not continue. Please select the correct answer and click "Done".
-error.content.locked =The content has been locked since it is being used by one mor more learners. The modification of the content is not allowed.
-error.content.inUse =modification of the content is not allowed since one or more learners has attempted the activity.
-error.noLearnerActivity =Summary report is not available since no learners attempted the activity yet.
-label.answers =Answers:
-button.endLearning =Next Activity
-label.learning.attemptTime =Attempt date
-label.learning.response =Response
-label.user =User
-label.attemptTime =Attempt date
-label.response =Response
-label.learning.forceOfflineMessage =This activity is not being done on the computer. Please see your instructor for details.
-error.defineLater =Please wait for the instructor to complete the contents of this activity.
-group.label =Group
-button.summary =Summary
-button.editActivity =Edit Activity
-button.stats =Stats
-label.edit =Edit
-label.update =Update
-label.selectGroup =Select group:
-label.stats.allGroups =All Groups:
-label.stats.totalAllGroups =Total count of all learners:
-authoring.msg.cancel.save =Do you want to close this window without saving?
-label.learning.forceFinishMessage =Responses are no more allowed. Please finish.
-label.correct =Correct
-label.passingMark =Passing mark
-label.mcqSummary =MCQ Summary
-label.yourAnswers =Learner's answers:
-label.learner =Learner
-button.try.again =Try again
-label.feedback =Question feedback
-label.notEnoughMarks =As you have not achieved the passing mark, you have to try the questions again.
-label.tip.moveQuestionDown =Down
-label.tip.moveQuestionUp =Up
-label.tip.editOptions =Enables editing of candidate answers
-label.tip.removeQuestion =Removes question
-label.tip.removeCandidate =Removes candidate answer
-label.studentMarks =Learner marks
-label.authoring.title.col =Title:
-label.authoring.instructions.col =Instructions:
-label.candidateAnswer =Candidate answer
-label.total =Total
-label.continue =Continue
-label.reflect =Add a notebook at end of MCQ with the following instructions:
-label.notebook.entries =Notebook entries
-label.reflection =Notebook entry
-label.view.reflection =View notebook entries
-label.close =Close
-label.question.marks =Marks
-label.tip.editQuestion =Enables editing of question
-candidates.none.correct =Please fix this: There must be 1 correct candidate answer out of at least 2 candidate answers.
-count.finished.session =Finished Session Count:
-label.add.candidates =Add answer
-label.add.new.question =Add
-label.marks =mark(s)
-label.questions =Questions
-label.questions.worth =This question is worth
-label.save.question =Add question
-label.tip.deleteQuestion =Deletes question
-label.tip.editCandidate =Enables editing of candidate answers
-label.tip.moveCandidateDown =Moves candidate answer down
-label.tip.moveCandidateUp =Moves candidate answer up
-question.blank =Question text can not be blank.
-question.duplicate =There are duplicate question entries.
-questions.none.submitted =No questions submitted. Please add at least one question.
-label.edit.question =Edit question
-label.feedback.simple =Feedback:
-candidates.duplicate.correct =Please fix this: There must be one and only one correct candidate answer.
-label.group.results =Group's top and average marks
-candidates.groupSize.warning =Please fix this: There must be at least 2 candidate answers.
-candidates.unremovable.groupSize =The candidate answer can not be removed since there must be at least 2 candidate answers.
-candidates.setFirst =Please be informed that the first candidate answer has been selected for you.
-candidates.blank =Please fix this: Candidate answer text can not be blank.
-label.showMarks =Show top and average mark
-label.randomize =Present answers in randomized order
-message.no.reflection.available =No notebook available
-label.attempt.count =Attempt count:
-label.final.attempt =Final attempt:
-output.desc.learner.mark =Total marks
-output.desc.learner.all.correct =All answers correct
-label.displayAnswers =Display correct answers, score and feedback after last question
-label.monitoring.yesDisplayAnswers =Learners are able to see the answers for the questions.
-label.monitoring.noDisplayAnswers1 =Learners are not able to see answers, scores or feedback for the questions
-label.monitoring.noDisplayAnswers2 =Do you want to allow learners to see the answers now?
-button.monitoring.yes =Yes
-output.desc.learner.all.correct.true =All correct
-output.desc.learner.all.correct.false =Not all correct
-label.monitoring.downloadMarks.button =Export marks
-label.monitoring.downloadMarks.question.mark =Question {0} (mark: {1})
-label.monitoring.downloadMarks.username =Username
-error.monitoring.spreadsheet.download =An error occurred while preparing the marks spreadsheet for download.
-label.on =On
-label.off =Off
-monitor.summary.th.advancedSettings =Advanced settings
-monitor.summary.td.addNotebook =Add a notebook at the end of MCQ
-monitor.summary.td.notebookInstructions =Notebook instructions
-error.pedagogical.planner.empty.answer.selected =In question {0} correct answer cannot be blank.
-monitor.summary.date.restriction =Deadline
-monitor.summary.when.date.restriction.is.set =Learners will not be able to answer questions after the set date and time.
-monitor.summary.after.date =Date/time:
-monitor.summary.set.restriction =Set restriction
-monitor.summary.unset.restriction =Remove restriction
-authoring.info.teacher.set.restriction =The instructor has set a restriction to this activity from {0} onwards.
-monitor.summary.notification =Notification
-monitor.summary.date.restriction.set =Deadline has been set
-monitor.summary.date.restriction.removed =Deadline has been removed
-label.authoring.import.qti =Import IMS QTI
-error.correct.answer.blank =Please correct this: Correct answer cannot be blank.
-label.submit =Finish
-label.report.by.question =Report by question
-label.report.by.student =Report by learner
-label.not.available =N/A
-label.legend =Legend
-label.denotes.correct.answer =*- Denotes the correct answer
-label.correct.answer =Correct answer
-label.ave =Average
-label.class.mean =Class mean
-label.median =Median
-label.learning.draft.autosaved =Draft autosaved
-label.monitoring.summary.user.name =Name
-label.monitoring.summary.total =Total
-label.monitoring.summary.learner.summary =Learner summary
-label.monitoring.user.summary.response =Response
-label.monitoring.user.summary.grade =Grade
-label.waiting.for.leader =Please, wait while somebody will become a group leader.
-label.users.from.group =Other learners participating in current group:
-label.use.select.leader.tool.output =Use leaders from Select Leader tool
-label.group.leader =Group leader: {0}
-label.refresh =Refresh
-label.prefix.sequential.letters.for.each.answer =Prefix sequential letters for each answer
-label.info.use.select.leader.outputs =Group leader's option is enabled
-label.monitoring.group.leader =Group leader
-label.authoring.export.qti =Export IMS QTI
-label.select.leader =Select leader
-label.question.options =Question options
-label.activity.completion =End of activity
-label.tool.output =Tool output
-label.tool.output.has.been.changed =Tool output has changed
-label.operation.failed =Operation failed
-answers.submitted.none =Select at least one answer for each of the questions.
-label.summary.downloaded =Marks file downloaded.
-label.number.learners =Learners
-label.number.groups.finished =Number of groups finished
-label.graph.help =In the graph(s) below, click on a bar in the graph and then use your mouse wheel to zoom in and out of the graph. Once you zoom in, the grey selection in the bottom graph can be dragged left or right to show a different set of marks.
-label.lowest.mark =Lowest mark
-label.highest.mark =Highest mark
-label.number.learners.in.mark.range =Number of learners in mark range
-label.number.groups.in.mark.range =Number of groups in mark range
-label.average.mark =Average mark
-label.error =Error
-error.loaderror =There was an error loading the grid. If this problem persists, please contact your system administrator.
-label.ok =OK
-message.monitoring.edit.activity.warning =Warning: if you edit and modify a question or change an answer that when a student has already answer, the marks will be recalculated based on the changes.
-label.enable.confidence.levels =Enable confidence level
-label.confidence =How confident are you of your answer?
-label.what.is.your.confidence.level =Confidence
-label.ira.questions.marks =iRA Questions & Marks
-label.attendance =Attendance
-label.show.students.choices =Show students' choices
-label.hide.students.choices =Hide students' choices
-label.print =Print
-label.excel.export =Excel export
-label.displayFeedbackOnly =Display only the feedback and not the answers or score
-label.displayNoAnswersOrFeedback =Do not display answers, score or feedback
-label.monitoring.yesDisplayFeedbackOnly =Learners are able to see the feedback but no answers or scores for the questions.
-label.monitoring.noDisplayFeedbackOnly1 =Learners are not able to see the feedback for the questions
-label.monitoring.noDisplayFeedbackOnly2 =Do you want to allow learners to see the feedback now?
-outcome.authoring.title =Learning outcomes
-outcome.authoring.input =Search and select by outcome name or code
-outcome.authoring.existing =Added outcomes
-outcome.authoring.existing.none =none
-outcome.authoring.remove.confirm =Are you sure you want to remove this learning outcome?
-warn.tool.output.change.none =This will delete all existing marks for this activity. Are you sure?
-output.desc.none =No score
-label.edit.in.monitor.warning =Attention: while you edit this activity, students don't have access to it. You must save your changes, so students can re-attempt this activity again.
-
-
-#======= End labels: Exported 229 labels for en AU =====
+appName = mcq
+#language code: en
+#locale code: AU
+
+ # Exported from the LAMS Community by Ernie Ghiglione on Thu Dec 27 22:45:28 CST 2018
+
+#=================== labels for Multiple Choice Questions =================#
+
+activity.title =Multiple Choice
+activity.description =Creates automated assessment questions. e.g. Multiple choice and true/false questions. Can provide feedback and scores.
+activity.helptext =Learner answers a series of automated assessment questions. e.g. Multiple choice and true/false questions. Optional features include feedback on each question and scoring. Questions are weighted for scoring.
+tool.display.name =Multiple Choice Tool
+tool.description =Tool for learners to answer a series of automated assessment questions.
+label.tool.shortname =MCQ
+label.basic =Basic
+label.advanced =Advanced
+label.summary =Summary
+label.stats =Stats
+label.editActivity =Edit Activity
+label.authoring =MCQ Authoring
+label.learning =MCQ Learning
+label.monitoring =MCQ Monitoring
+label.authoring.title =Title
+label.authoring.instructions =Instructions
+label.Questions =Questions
+label.addNewQuestion =Add new question
+label.moveDown =Down
+label.add.question =Add New
+label.add.option =Add New
+label.mc.options.col =Candidate answers:
+label.learner.message =You can only proceed to the activity after you have reached the passing mark
+label.viewAnswers =Summary of responses
+label.topMark =Top mark:
+label.avMark =Average mark:
+label.loMark =Lowest mark:
+count.total.user =Total users count:
+label.mark =Mark:
+label.redo.questions =Redo questions
+label.view =View
+label.finished =Next Activity
+button.submit =Submit
+button.continue =Continue
+label.isCorrect =Correct?
+label.question.only =Question
+label.question =Question
+radiobox.passmark =Pass mark
+radiobox.onepq =One question per page
+radiobox.retries =Allow retries
+option.correct =Correct
+label.outof =out of
+label.save =Save
+label.cancel =Cancel
+feedback =Please address the following issues before submit.
+error.passMark.empty =Please correct this: Pass mark can not be empty.
+options.count.zero =Please correct this: There must be at least one candidate answer.
+error.passmark.notInteger =Please correct this: Pass mark can only be an integer.
+error.file.notPersisted =An error occurred: The file is not viewable yet. Please save all the content first and check back.
+error.fileName.empty =Please correct this: Under "Instructions", the file(name) to upload can not be empty.
+error.questions.withNoOptions =Please note: The questions with no candidate answers have been automatically removed for you. Please check total question weight.
+error.answers.empty =Please correct this: Candidate answers can not be empty.
+error.passMark.greater100 =Please correct this: The passmark can not be greater than 100%
+error.question.addNotAllowed.thisScreen =The question text can not be modified in this screen since it has options attached . Please use the "Options" button to edit the question text.
+error.question.removeNotAllowed.thisScreen =The question can not be removed since one or more of the question texts has been modified. Please try again without any text modifications.
+error.selectedIndex.empty =Can not continue. Please select the correct answer and click "Done".
+error.content.locked =The content has been locked since it is being used by one mor more learners. The modification of the content is not allowed.
+error.content.inUse =modification of the content is not allowed since one or more learners has attempted the activity.
+error.noLearnerActivity =Summary report is not available since no learners attempted the activity yet.
+label.answers =Answers:
+button.endLearning =Next Activity
+label.learning.attemptTime =Attempt date
+label.learning.response =Response
+label.user =User
+label.attemptTime =Attempt date
+label.response =Response
+label.learning.forceOfflineMessage =This activity is not being done on the computer. Please see your instructor for details.
+error.defineLater =Please wait for the instructor to complete the contents of this activity.
+group.label =Group
+button.summary =Summary
+button.editActivity =Edit Activity
+button.stats =Stats
+label.edit =Edit
+label.update =Update
+label.selectGroup =Select group:
+label.stats.allGroups =All Groups:
+label.stats.totalAllGroups =Total count of all learners:
+authoring.msg.cancel.save =Do you want to close this window without saving?
+label.learning.forceFinishMessage =Responses are no more allowed. Please finish.
+label.correct =Correct
+label.passingMark =Passing mark
+label.mcqSummary =MCQ Summary
+label.yourAnswers =Learner's answers:
+label.learner =Learner
+button.try.again =Try again
+label.feedback =Question feedback
+label.notEnoughMarks =As you have not achieved the passing mark, you have to try the questions again.
+label.tip.moveQuestionDown =Down
+label.tip.moveQuestionUp =Up
+label.tip.editOptions =Enables editing of candidate answers
+label.tip.removeQuestion =Removes question
+label.tip.removeCandidate =Removes candidate answer
+label.studentMarks =Learner marks
+label.authoring.title.col =Title:
+label.authoring.instructions.col =Instructions:
+label.candidateAnswer =Candidate answer
+label.total =Total
+label.continue =Continue
+label.reflect =Add a notebook at end of MCQ with the following instructions:
+label.notebook.entries =Notebook entries
+label.reflection =Notebook entry
+label.view.reflection =View notebook entries
+label.close =Close
+label.question.marks =Marks
+label.tip.editQuestion =Enables editing of question
+candidates.none.correct =Please fix this: There must be 1 correct candidate answer out of at least 2 candidate answers.
+count.finished.session =Finished Session Count:
+label.add.candidates =Add answer
+label.add.new.question =Add
+label.marks =mark(s)
+label.questions =Questions
+label.questions.worth =This question is worth
+label.save.question =Add question
+label.tip.deleteQuestion =Deletes question
+label.tip.editCandidate =Enables editing of candidate answers
+label.tip.moveCandidateDown =Moves candidate answer down
+label.tip.moveCandidateUp =Moves candidate answer up
+question.blank =Question text can not be blank.
+question.duplicate =There are duplicate question entries.
+questions.none.submitted =No questions submitted. Please add at least one question.
+label.edit.question =Edit question
+label.feedback.simple =Feedback:
+candidates.duplicate.correct =Please fix this: There must be one and only one correct candidate answer.
+label.group.results =Group's top and average marks
+candidates.groupSize.warning =Please fix this: There must be at least 2 candidate answers.
+candidates.unremovable.groupSize =The candidate answer can not be removed since there must be at least 2 candidate answers.
+candidates.setFirst =Please be informed that the first candidate answer has been selected for you.
+candidates.blank =Please fix this: Candidate answer text can not be blank.
+label.showMarks =Show top and average mark
+label.randomize =Present answers in randomized order
+message.no.reflection.available =No notebook available
+label.attempt.count =Attempt count:
+label.final.attempt =Final attempt:
+output.desc.learner.mark =Total marks
+output.desc.learner.all.correct =All answers correct
+label.displayAnswers =Display correct answers, score and feedback after last question
+label.monitoring.yesDisplayAnswers =Learners are able to see the answers for the questions.
+label.monitoring.noDisplayAnswers1 =Learners are not able to see answers, scores or feedback for the questions
+label.monitoring.noDisplayAnswers2 =Do you want to allow learners to see the answers now?
+button.monitoring.yes =Yes
+output.desc.learner.all.correct.true =All correct
+output.desc.learner.all.correct.false =Not all correct
+label.monitoring.downloadMarks.button =Export marks
+label.monitoring.downloadMarks.question.mark =Question {0} (mark: {1})
+label.monitoring.downloadMarks.username =Username
+error.monitoring.spreadsheet.download =An error occurred while preparing the marks spreadsheet for download.
+label.on =On
+label.off =Off
+monitor.summary.th.advancedSettings =Advanced settings
+monitor.summary.td.addNotebook =Add a notebook at the end of MCQ
+monitor.summary.td.notebookInstructions =Notebook instructions
+error.pedagogical.planner.empty.answer.selected =In question {0} correct answer cannot be blank.
+monitor.summary.date.restriction =Deadline
+monitor.summary.when.date.restriction.is.set =Learners will not be able to answer questions after the set date and time.
+monitor.summary.after.date =Date/time:
+monitor.summary.set.restriction =Set restriction
+monitor.summary.unset.restriction =Remove restriction
+authoring.info.teacher.set.restriction =The instructor has set a restriction to this activity from {0} onwards.
+monitor.summary.notification =Notification
+monitor.summary.date.restriction.set =Deadline has been set
+monitor.summary.date.restriction.removed =Deadline has been removed
+label.authoring.import.qti =Import IMS QTI
+error.correct.answer.blank =Please correct this: Correct answer cannot be blank.
+label.submit =Finish
+label.report.by.question =Report by question
+label.report.by.student =Report by learner
+label.not.available =N/A
+label.legend =Legend
+label.denotes.correct.answer =*- Denotes the correct answer
+label.correct.answer =Correct answer
+label.ave =Average
+label.class.mean =Class mean
+label.median =Median
+label.learning.draft.autosaved =Draft autosaved
+label.monitoring.summary.user.name =Name
+label.monitoring.summary.total =Total
+label.monitoring.summary.learner.summary =Learner summary
+label.monitoring.user.summary.response =Response
+label.monitoring.user.summary.grade =Grade
+label.waiting.for.leader =Please, wait while somebody will become a group leader.
+label.users.from.group =Other learners participating in current group:
+label.use.select.leader.tool.output =Use leaders from Select Leader tool
+label.group.leader =Group leader: {0}
+label.refresh =Refresh
+label.prefix.sequential.letters.for.each.answer =Prefix sequential letters for each answer
+label.info.use.select.leader.outputs =Group leader's option is enabled
+label.monitoring.group.leader =Group leader
+label.authoring.export.qti =Export IMS QTI
+label.select.leader =Select leader
+label.question.options =Question options
+label.activity.completion =End of activity
+label.tool.output =Tool output
+label.tool.output.has.been.changed =Tool output has changed
+label.operation.failed =Operation failed
+answers.submitted.none =Select at least one answer for each of the questions.
+label.summary.downloaded =Marks file downloaded.
+label.number.learners =Learners
+label.number.groups.finished =Number of groups finished
+label.graph.help =In the graph(s) below, click on a bar in the graph and then use your mouse wheel to zoom in and out of the graph. Once you zoom in, the grey selection in the bottom graph can be dragged left or right to show a different set of marks.
+label.lowest.mark =Lowest mark
+label.highest.mark =Highest mark
+label.number.learners.in.mark.range =Number of learners in mark range
+label.number.groups.in.mark.range =Number of groups in mark range
+label.average.mark =Average mark
+label.error =Error
+error.loaderror =There was an error loading the grid. If this problem persists, please contact your system administrator.
+label.ok =OK
+message.monitoring.edit.activity.warning =Warning: if you edit and modify a question or change an answer that a learner has already answered, then the mark attained for the modified question will be deleted as it is assumed that the question has changed. If the option for retries is available, then the learner can submit an answer for this question again.
+label.enable.confidence.levels =Enable confidence level
+label.confidence =How confident are you of your answer?
+label.what.is.your.confidence.level =Confidence
+label.ira.questions.marks =iRA Questions & Marks
+label.attendance =Attendance
+label.show.students.choices =Show students' choices
+label.hide.students.choices =Hide students' choices
+label.print =Print
+label.excel.export =Excel export
+label.displayFeedbackOnly =Display only the feedback and not the answers or score
+label.displayNoAnswersOrFeedback =Do not display answers, score or feedback
+label.monitoring.yesDisplayFeedbackOnly =Learners are able to see the feedback but no answers or scores for the questions.
+label.monitoring.noDisplayFeedbackOnly1 =Learners are not able to see the feedback for the questions
+label.monitoring.noDisplayFeedbackOnly2 =Do you want to allow learners to see the feedback now?
+outcome.authoring.title =Learning outcomes
+outcome.authoring.input =Search and select by outcome name or code
+outcome.authoring.existing =Added outcomes
+outcome.authoring.existing.none =none
+outcome.authoring.remove.confirm =Are you sure you want to remove this learning outcome?
+warn.tool.output.change.none =This will delete all existing marks for this activity. Are you sure?
+output.desc.none =No score
+label.edit.in.monitor.warning =Attention: while you edit this activity, students don't have access to it. You must save your changes, so students can re-attempt this activity again.
+message.qb.modified.update =The question in Question Bank will be updated
+message.qb.modified.version =A new version of the question will be created in Question Bank
+message.qb.modified.new =A new question will be created in Question Bank
+label.qb.stats =Question indexes
+label.qb.participant.count =Test participant count
+label.qb.difficulty.index =Difficulty index
+label.qb.discrimination.index =Discrimination index
+label.qb.point.biserial =Point biserial
+#======= End labels: Exported 228 labels for en AU =====
Index: lams_tool_lamc/conf/language/lams/ApplicationResources_en_AU.properties
===================================================================
diff -u -r298ac30bd04d6cdffdbbc42d1ceec29831809dc7 -r394f403c289f0fd7808c228840bead5c4e7d5d32
--- lams_tool_lamc/conf/language/lams/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision 298ac30bd04d6cdffdbbc42d1ceec29831809dc7)
+++ lams_tool_lamc/conf/language/lams/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision 394f403c289f0fd7808c228840bead5c4e7d5d32)
@@ -2,7 +2,7 @@
#language code: en
#locale code: AU
- # Exported from the LAMS Community by Ernie Ghiglione on Sun Mar 24 18:02:01 CST 2019
+ # Exported from the LAMS Community by Ernie Ghiglione on Thu Dec 27 22:45:28 CST 2018
#=================== labels for Multiple Choice Questions =================#
@@ -213,7 +213,7 @@
label.error =Error
error.loaderror =There was an error loading the grid. If this problem persists, please contact your system administrator.
label.ok =OK
-message.monitoring.edit.activity.warning =Warning: if you edit and modify a question or change an answer that when a student has already answer, the marks will be recalculated based on the changes.
+message.monitoring.edit.activity.warning =Warning: if you edit and modify a question or change an answer that a learner has already answered, then the mark attained for the modified question will be deleted as it is assumed that the question has changed. If the option for retries is available, then the learner can submit an answer for this question again.
label.enable.confidence.levels =Enable confidence level
label.confidence =How confident are you of your answer?
label.what.is.your.confidence.level =Confidence
@@ -236,6 +236,12 @@
warn.tool.output.change.none =This will delete all existing marks for this activity. Are you sure?
output.desc.none =No score
label.edit.in.monitor.warning =Attention: while you edit this activity, students don't have access to it. You must save your changes, so students can re-attempt this activity again.
-
-
-#======= End labels: Exported 229 labels for en AU =====
+message.qb.modified.update =The question in Question Bank will be updated
+message.qb.modified.version =A new version of the question will be created in Question Bank
+message.qb.modified.new =A new question will be created in Question Bank
+label.qb.stats =Question indexes
+label.qb.participant.count =Test participant count
+label.qb.difficulty.index =Difficulty index
+label.qb.discrimination.index =Discrimination index
+label.qb.point.biserial =Point biserial
+#======= End labels: Exported 228 labels for en AU =====
Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/McAppConstants.java
===================================================================
diff -u -r6ec43132d9df310eebff50fac6fca9f095757bd7 -r394f403c289f0fd7808c228840bead5c4e7d5d32
--- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/McAppConstants.java (.../McAppConstants.java) (revision 6ec43132d9df310eebff50fac6fca9f095757bd7)
+++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/McAppConstants.java (.../McAppConstants.java) (revision 394f403c289f0fd7808c228840bead5c4e7d5d32)
@@ -84,7 +84,7 @@
public static final String CORRECT = "Correct";
/* learner mode contants */
- public static final String LEARNER_ANSWERS_DTO_LIST = "learnerAnswersDTOList";
+ public static final String LEARNER_ANSWER_DTOS = "learnerAnswerDtos";
public static final String MC_GENERAL_LEARNER_FLOW_DTO = "mcGeneralLearnerFlowDTO";
public static final String NOTEBOOK = "notebook";
public static final String ENTRY_TEXT = "entryText";
Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/IMcUsrAttemptDAO.java
===================================================================
diff -u -r6ec43132d9df310eebff50fac6fca9f095757bd7 -r394f403c289f0fd7808c228840bead5c4e7d5d32
--- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/IMcUsrAttemptDAO.java (.../IMcUsrAttemptDAO.java) (revision 6ec43132d9df310eebff50fac6fca9f095757bd7)
+++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/IMcUsrAttemptDAO.java (.../IMcUsrAttemptDAO.java) (revision 394f403c289f0fd7808c228840bead5c4e7d5d32)
@@ -97,12 +97,12 @@
List