Giter Club home page Giter Club logo

wam's Introduction

WAM

Prototype workload allocation modeller

This is a simple prototype django web app for working out approximate distribution of workload in a Higher Education environment. It also has some ancillary features such as the ability to allocate short tasks and remind staff about their completion and track module and exam QA processes.

Free and Open Source Software

This is Free and Open Source Software. You are free to use it in your institution.

Key Features

Some of the current key features of this software are:

  • Allows staff, activities and models to be split into "Work Packages", which typically can be used for a given department in a given academic year. The model may vary from year to year.
  • Promotes transparency by allowing those staff within the model to their workload in relation to their peers.
  • Allows activities to be split across types and categories.
  • Allows activities to be allocated against 1-3 semesters to help analyse loading across an academic year.
  • Activities can be allocated by hours or percentages of overall time.
  • Loading can be viewed by staff but also by modules to help identify gaps.
  • Can store details on "projects" like Research Grants to add loading to relevant staff.
  • Generators can be created to add workload to multiple users.

There are some additional features, which may eventually be split into a second app.

  • Allows tasks to be set against individual staff or groups and self certification of completion.
  • Can email staff task reminders
  • Allows assessment and moderation items to be handled securely online.

More detailed information can be found in the Wiki

wam's People

Contributors

profcturner avatar

Stargazers

 avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

wam's Issues

Consider subsuming ExternalExaminer model into Staff

A separate model was created for ExternalExaminers but currently in terms of data it doesn't add anything not in Staff. A number of other issues would be resolved, or minimised by making ExternalExaminer users just other Staff users.

  • it would allow ExternalExaminers to be allocated tasks. In fact a user managed to do this previously by creating both a Staff and ExternalExaminer object for the same User.
  • #19 would be more easily resolved (allowing AssessmentResources to be downloaded
  • #20 similarly would be made easier and ExternalExaminers could use the same interface to change package.

This change requires some thought, but I think this would be a way forward:

  • add either Booleans is_academic() or is_external() or has_workload() or similar to Staff
  • use limit_choices_to in appropriate ForeignKeys to restrict to real Staff or Externals etc.
  • create a migration to port the existing ExternalExaminers to Staff objects that are appropriate flagged.
  • ideally Staff would be better being renamed to something more appropriate, like Person

Handle "past" signoffs better - in terms of notifications

Currently there are numerous dire warnings when a user tries to sign off an assessment state for a work package in the past - because this is usually a mistake that they haven't moved to the current academic year.

The dire warnings are still periodically ignored in such mistaken circumstances, and the system is set up not to send notifications (by default); however, this leads to the problem being rolled through each cron job. It may be better to:

  1. just set a notification time and no notifications
  2. send a notification only to the user sending the sign off, warning them yet again, and asking them to forward manually if it's correct
  3. send a notification to all potential parties, but warning them about the past sign off status
  4. disallow all such sign offs.

I'm not sure which option is best, yet.

New Add Task dialog doesn't include all groups

The new Add Task dialog tries to limit target users and groups to a more appropriate set, but it limits groups too much. For instance, admin staff cannot select the academic staff group within the same workpackage.

It should probably select all groups that are within the valid workpackages for that user.

Custom front-end should allow admins to delete sign offs

On rare occasions, it is necessary to delete sign offs done in error. At the moment this is possible in the Django provided interface for certain admins. It may be better for those admins to have a simpler facility to do this within the main admin features.

Allow External Examiners to defer notifications until all the assessments are ready.

This feature request is:

We’d like if the EEs weren’t prompted every time a sign-off happens, but rather when their EE assessment load was complete, they would receive an email to say that their assigned modules were ready for review.

This is not trivial to do. First of all it is difficult for the system to determine in a bullet proof way that all modules are ready for review unless every module coordinator is scrupulously compliant. Batching communications is also a bit tricky because the system generates emails on a sign off event, and keeping emails for some recipients but not others is a bit complex.

In the meantime, I would encourage EE's to use a rule to filter their email into a subfolder.

Work Package cloning needs also to consider Programmes for examinations etc.

While #2 looks at linkage issues in cloned work packages, these will also arise from the new functionality in Programmes.

Modules now link to Programmes, but Programmes are themselves versioned within Packages.

As a result the Clone functionality will also need to clone Programmes and preserve a mapping from one to the other.

Thereafter cloned Modules will need to be adjusted to point at the newly remapped Programmes. #

Modules with Programmes from outside the WorkPackage cause clone errors

It appears that currently some modules have no programme - but the current clone logic causes a KeyError as it attempts to remap programmes to the cloned version. Maybe old_programme is not a Programme object.

            old_module_programmes = old_module.programmes.all()
            old_module_moderators = old_module.moderators.all()
            for old_programme in old_module_programmes:
                # Remove the old programme reference
                module.programmes.remove(old_programme)
                # And add the mapped (new) one
                module.programmes.add(Programme.objects.get(pk=programme_mapping[old_programme.pk])) ...
            # Copy moderators too
            for moderator in old_module_moderators:
                module.moderators.add(moderator)
            # Save the many to manys
            module.save()

Some better workflow for AssessmentResources is needed

I've been avoiding writing workflow for this until I had a better idea how it should work, but the current system just isn't good enough.

There probably needs to be some sort of "signal" workflow where stakeholders flag they have completed a task, and that the system notes this, and notifies the next relevant stakeholders.

For instance, a Model that included signal types, and which categories of users to notify might help. Then a team member could file a signal of type "initial upload" with comments, that would flag "moderator users". Moderators could choose between a bounce back signal or a pass on signal etc...

I want not to enshrine a particular workflow if I can avoid it. However, a given signal Model could also specify next permitted Signals?

Add graphical reporting within a Work Package

We should seek to allow graphs to show

  • the logged in user's position in a histogram
  • break down of a package histogram by category or activity type
  • Longitudinal variation for a user

Add assessment progress reporting

A request has been made for a spreadsheet export of the modules page - this could be done in CSV. It might be a good idea to think of a broader reporting strategy - for instance, to email this data.

Work package cloning incorrectly clones module related custom activities linked to the original module

The functionality should clone custom activities with no module links.

It should then carefully copy module related custom activities converting the module link to the new module.

Currently it will duplicate activities in the original work package.

  • % Done changed from 0 to 20
  • Target version changed from 1.2.0 to 2.0.0
  • Estimated time changed from 1.50 h to 4.00 h
  • Some thoughts:

Dialog box for cloning needs to include:

Activities not within modules or automatically generated (Custom, manual activities)
Modules (and sub choices for ModuleStaff and Module related Activities)
List all Activities generated by a Generator (not Project), allow each to be copied, with select all or deselect all options
(this last point needs some research to see how it can be done in Django).

The algorithm for the clone should:

  • Copy Activities not associated with a Module or an ActivitySet
  • Copy the Modules
  • For each Module, copy across linked Activities, correcting their linked Module key
  • For each Module, copy across linked ModuleStaff allocations, correcting their linked Module key
  • For each Module, copy across selected generated activities, copy the activity, relinking the package and module and creating another ActivitySet?
  • Do the same for generated activities not linked to a Module.

Likely issues, this requires reordering of the Python Django model classes, and I'm worried it will create a circular dependency. Can we resolve this by devolving some cloning activities to other models? No, because we'd have to reference the other Model...

Email on sign offs need to consider the possibility that lead_programme is not set

See below. A check is needed here.

Traceback (most recent call last):
  File "/usr/local/share/WAM/manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/usr/lib/python3/dist-packages/django/core/management/__init__.py", line 367, in execute_from_command_line
    utility.execute()
  File "/usr/lib/python3/dist-packages/django/core/management/__init__.py", line 359, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/lib/python3/dist-packages/django/core/management/base.py", line 294, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/usr/lib/python3/dist-packages/django/core/management/base.py", line 345, in execute
    output = self.handle(*args, **options)
  File "/usr/local/share/WAM/loads/management/commands/email_assessmentupdates.py", line 65, in handle
    if self.email_updates_for_signoff(signoff, options):
  File "/usr/local/share/WAM/loads/management/commands/email_assessmentupdates.py", line 102, in email_updates_for_signoff
    for external in signoff.module.lead_programme.examiners.all():
AttributeError: 'NoneType' object has no attribute 'examiners'

Improve guidance for adding new Users

One user with permission to add Staff and External Examiners didn't realise that the username should be the staff number for the University in almost all cases, and certainly for Ulster. The guidance here needs to be more clear.

Provide enhanced interface for adding assessment staff

WAM deliberately does not role over assessment staff when work packages are cloned. This is a security feature to ensure these staff are considered each work package (usually every year).

However, an enhanced interface to show the previous selected staff for potential manual roll over.

Allow more guidance and / or checks for Workflow forks

In some cases one workflow option is provided as a safety precaution. For instance, by default it is possible for a Module Coordinator to do final sign off without External Examiner sign-off. But this is intended only for this case.

Possible improvements:

  • the AssessmentState object is augmented to have help for each state, and possible next states.
  • the drop down options that aren't available should perhaps be there but greyed out, or otherwise shown somewhere?
  • possibly allow another model that allows bespoke warnings from state A to state B.

New Add Task View needs better date picker

The new Add Task View introduced in Version 2.0.0 allows a deadline to be specified, but without explanation of the format (ISO) or a nice date picker.

The Admin interface provides this and so it might be used from that.

There needs to be a single form for the creation of Staff / External Examiner accounts

Currently creating a Staff user or External Examiner user requires the underlying User object to be created (often with an unnecessary password - since in production I am using CAS), and then the linked Staff object to be created, or ExternalExaminer object.

It would be useful to have a single admin form for each of these use cases. In a perfect world, there would be self sign-up, but there might be security issues involved in that - well, if the WorkPackage was selectable by the user without intervention.

Can't currently delete assessment items

This appears to be a regressions of #11 in that a confirmation step for deletion of assessment items was previous working but no longer is.

Most likely it stopped working with a Django upgrade.

screenshot 2019-02-12 at 16 02 52

Sometimes incorrect help is shown for next assessment states in modules details

I have seen an example of a module where the help for the next assessment states is incorrect in the module_details view but correct in the add_assessment_sign_off view.

The latter only uses

    assessment_signoffs = AssessmentStateSignOff.objects.all().filter(module=module).order_by('-created')

for the assessment Information while the former relies on the more detailed

assessment_history = module.get_assessment_history()

In the module in case there was an assessment item uploaded and not signed off (and an incorrect sign off had been deleted). Needs more investigation.

Users with no matching Staff Model instance should be handled more elegantly

Particularly with REMOTE_USER usage someone may be authenticated and even a user auto created for which there is no matching staff entry. This needs to be caught and handled.

Another example is an initially created superuser (but they won't use have a Staff user). This may mean that the most recent version is difficult to install out of the box.

Created Superusers at the command line have no matching Staff object

Two people have tried to install WAM and run into this issue. The code now will cause exceptions if a User has no matching Staff object, and yet the createsuperuser does not create the Staff.

Hmm, it’s actually probably a flaw in that your user object has no matching staff user, and something I will definitely need to resolve. We must file an issue on that.

In the mean time, try something like the following will work around this.

python3 manage.py shell

Python 3.6.1 (v3.6.1:69c0db5050, Mar 21 2017, 01:21:04)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)

from loads.models import Staff
from django.contrib.auth.models import User
users = User.objects.all()
users[0]
<User: TEST1000>
root_user = users[0]
staff = Staff.objects.create(user=root_user, title="Mr", staff_number="whatever")

Highlight the lack of a signoff more clearly

Sometimes colleagues upload resources but do not sign them off causing some confusion, and there are some tweaks that may help.

  • it might be useful to have an extra visual prompt that this is being awaited.
  • when a user can't signoff (because the system is waiting on someone else) this could be indicated more clearly
  • maybe an email report could indicate such potentially stalled processes.

This last step would need some thought to prevent persistent emails for situations that will never be fixed.

Allow Modules Index to be restricted by Programme

Currently the Modules Index can be restricted by semester. Dr Alan Brown would like users to be able to show only the Modules on a specific Programme, or further, the Modules on a specific Programme where that Programme is the lead Programme.

The reason is that so course level administrators and directors can see how their modules are coming along in assessment terms.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.