Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions WAM/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,14 @@

from loads import views

from loads.views import CreateActivityGeneratorView
from loads.views import UpdateActivityGeneratorView
from loads.views import DeleteActivityGeneratorView
from loads.views import CreateProgrammeView
from loads.views import ProgrammeList
from loads.views import UpdateProgrammeView
from loads.views import DetailsProgrammeView
from loads.views import CreateProjectView
from loads.views import CreateModuleView
from loads.views import UpdateModuleView
from loads.views import CreateTaskView
Expand Down Expand Up @@ -69,6 +73,9 @@
name='generators_index'),
re_path(r'^generators/generate_activities/(?P<generator_id>[0-9]+)$', views.generators_generate_activities,
name='generators_generate_activities'),
re_path(r'^generators/create$', CreateActivityGeneratorView.as_view(), name='create generator'),
re_path(r'^generators/update/(?P<pk>[0-9]+)$', UpdateActivityGeneratorView.as_view(), name='update generator'),
re_path(r'^generators/delete/(?P<pk>[0-9]+)$', DeleteActivityGeneratorView.as_view(), name='delete generator'),
re_path(r'^tasks/index/$', views.tasks_index,
name='tasks_index'),
re_path(r'^tasks/archived/index/$', views.archived_tasks_index,
Expand Down Expand Up @@ -104,6 +111,7 @@
re_path(r'^programmes/details/(?P<pk>[0-9]+)$', DetailsProgrammeView.as_view(), name='view programme'),
re_path(r'^programmes/delete/(?P<pk>[0-9]+)$', DeleteProgrammeView.as_view(), name='delete programme'),
re_path(r'^projects/index/$', views.projects_index, name='projects_index'),
re_path(r'^projects/create/$', CreateProjectView.as_view(), name='create project'),
re_path(r'^projects/detail/(?P<project_id>[0-9]+)$', views.projects_details, name='projects_details'),
re_path(r'^projects/generate_activities/(?P<project_id>[0-9]+)$', views.projects_generate_activities,
name='projects_generate_activities'),
Expand Down
13 changes: 12 additions & 1 deletion loads/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from django.db import transaction
from django.core.exceptions import ValidationError

from .models import AssessmentResource, Task, Module
from .models import AssessmentResource, Task, Module, ActivityGenerator
from .models import AssessmentStaff
from .models import AssessmentStateSignOff
from .models import Staff
Expand Down Expand Up @@ -157,6 +157,16 @@ class ModulesIndexForm(forms.Form):

# Forms based on Models

class ActivityGeneratorForm(ModelForm):
"""Form for creating or editing activity generators"""

class Meta:
model = ActivityGenerator
fields = ['name', 'hours', 'percentage', 'hours_percentage', 'semester', 'activity_type',
'module', 'comment', 'package', 'details', 'targets', 'groups']
widgets = {'details': forms.TextInput,
'package': forms.HiddenInput()}

class AssessmentStaffForm(ModelForm):
"""Used for adding AssessmentStaff to a work package"""

Expand Down Expand Up @@ -469,6 +479,7 @@ def save(self):

return user

# Formsets

class BaseModuleStaffByStaffFormSet(FancyModelFormSet):
""" Enables altering teaching allocation for a member of staff from staff views """
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
{% extends "loads/base_automatic.html" %}

{% block content %}

<h3 class="my-3">Delete generator</h3>
<h4 class="text-info-emphasis font-monospace">({{ object }})</h4>

{% if object.package.in_the_past %}
<div class="border border-2 border-danger p-4 pb-3 rounded-3 mt-4 mb-4">
<p class="fw-bold">Warning: The Work Package for this item is in the past!</p>
<p>You should not be deleting past generators unless they are a correction.</p>
</div>
{% endif %}

<div class="mt-5">
<p>
You are deleting <span class="font-monospace">"{{ object }}"</span> in year
<span class="font-monospace">"{{ object.package }}"</span>
</p>
<div class="fw-bold mt-4">
Deleting generators will not delete activities they already created.
</div>
</div>

<div class="mt-5">
<p class="mt-5 fw-bold">
This cannot be undone! Are you sure?
</p>
<p>
<form method="post">
{{ form }}
{% csrf_token %}
<p class="mt-3">
<input type="submit" class="btn btn-danger me-4" role="button" value="Confirm" />
<a class="btn btn-primary" role="button" href="{% url 'generators_index' %}">Cancel</a>
</p>
</form>
</p>
</div>

{% endblock content %}
95 changes: 95 additions & 0 deletions loads/templates/loads/generators/activitygenerator_form.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
{% extends "loads/base_automatic.html" %} {% block content %}

{% if form.instance.pk %}
<h3 class="my-3">
Update Activity Generator
</h3>
{% else %}
<h3 class="my-3">
Create Activity Generator
</h3>
<p>
This form allows the creation of new Activity generators.
</p>
{% endif %}

<div class="border border-secondary-subtle rounded-3 p-3 mb-3 mt-3">
<form action="" method="post">
{% csrf_token %}
{# Process hidden fields, we don't need to style them #}
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
{% for field in form.visible_fields %}
<div class="row mb-3">
<label for="{{ field.id_for_label }}"
class="col-12 col-md-3 form-label">{{ field.label }}</label>
{% if field.field.widget.input_type == "text" or field.field.widget.input_type == "number" %}
<div class="col-12 col-md-9">
<input type="{{ field.field.widget.input_type }}" class="form-control" id="{{ field.id_for_label }}"
{% for name, value in field.field.widget.attrs.items %}
{% if value is not False %} {{ name }}{% if value is not True %}="{{ value|stringformat:'s' }}"{% endif %}{% endif %}
{% endfor %}
name="{{ field.html_name }}"
value="{% if field.value != None %}{{ field.value|stringformat:'s' }}{% endif %}"{% if field.field.required %} required{% endif %} />
{# Show field errors as a list, one per line #}
{% if field.errors %}
<div class="wam-text-danger small mt-1">
{% for error in field.errors %}
<p>{{ error|escape }}</p>
{% endfor %}
</div>
{% endif %}
</div>
{% elif field.field.widget.input_type == "select" %}
<div class="col-12 col-md-9">
<select class="form-select" id="{{ field.id_for_label }}"
{% for name, value in field.field.widget.attrs.items %}
{% if value is not False %}{{ name }}{% if value is not True %}="{{ value|stringformat:'s' }}"{% endif %}{% endif %}
{% endfor %}
name="{{ field.name }}"
value="{% if field.value != None %}{{ field.value }}{% else %}{% endif %}"
{% if field.field.widget.allow_multiple_selected %} MULTIPLE {% endif %}>
{% for option in field.field.choices %}
<option value="{{ option.0|escape }}"{% if option.0 in field.value or option.0 == field.value %} selected{% endif %}>
{{ option.1|escape }}
</option>
{% endfor %}
</select>
{% if field.field.widget.allow_multiple_selected %}
<div class="form-text mt-2">
Hold down <kbd>CTRL</kbd> or <kbd>CMD</kbd> to select multiple options
</div>
{% endif %}
{# Show field errors as a list, one per line #}
{% if field.errors %}
<div class="wam-text-danger small mt-1">
{% for error in field.errors %}
<p>{{ error|escape }}</p>
{% endfor %}
</div>
{% endif %}
</div>
{% else %}
<div class="col-12 col-md-8 form-text font-monospace">
Unknown field type: {{ field.field.widget.input_type }}
</div>
{% endif %}
</div>
{% endfor %}
<div class="row mt-4 mb-3 d-print-none">
<div class="col-6 col-md-9">
<input class="btn btn-primary me-2" type="submit" value="Submit" />
<a class="btn btn-secondary" role="button" href="{% url 'generators_index' %}">Cancel</a>
</div>
{% if form.instance.pk %}
<div class="col-6 col-md-3 text-end">
<a class="btn btn-danger" role="button" href="{% url 'delete generator' form.instance.pk %}">Delete generator</a>
</div>
{% endif %}
</div>

</form>
</div>

{% endblock content %}
12 changes: 10 additions & 2 deletions loads/templates/loads/generators/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -49,15 +49,19 @@ <h3 class="my-3">Activity Generators</h3>
<tr>
<th scope="col">Generator name</th>
<th scope="col">Activity type</th>
<th scope="col" class="text-center wam-hide-on-print">Generate activities</th>
<th scope="col" class="wam-hide-on-print">Update</th>
<th scope="col" class="wam-hide-on-print">Activities</th>
</tr>
</thead>
<tbody class="table-group-divider">
{% for generator in generators %}
<tr>
<th>{{ generator.name }}</th>
<td>{{ generator.activity_type }}</td>
<td class="text-center wam-hide-on-print">
<td class="wam-hide-on-print">
<a class="link-opacity-50-hover link-underline-opacity-50 link-offset-2" href="{% url 'update generator' generator.id %}">Update</a>
</td>
<td class="wam-hide-on-print">
<a class="link-opacity-50-hover link-underline-opacity-50 link-offset-2" href="{% url 'generators_generate_activities' generator.id %}">Generate</a>
</td>
</tr>
Expand All @@ -74,5 +78,9 @@ <h3 class="my-3">Activity Generators</h3>
No activity generators are available in this work package.
</p>
{% endif %}
<div class="mt-5 wam-hide-on-print">
<h4>Add activity generator</h4>
<a class="link-opacity-50-hover link-underline-opacity-50 link-offset-2" href="{% url 'create generator' %}">Click here to create a new activity generator</a>
</div>

{% endblock content %}
4 changes: 4 additions & 0 deletions loads/templates/loads/projects/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -58,5 +58,9 @@ <h3 class="my-3">Projects</h3>
No unarchived projects are available.
</p>
{% endif %}
<div class="mt-5 wam-hide-on-print">
<h4>Add project</h4>
<a class="link-opacity-50-hover link-underline-opacity-50 link-offset-2" href="{% url 'create project' %}">Click here to create a new project</a>
</div>

{% endblock content %}
97 changes: 97 additions & 0 deletions loads/templates/loads/projects/project_form.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
{% extends "loads/base_automatic.html" %} {% block content %}

{% if form.instance.pk %}
<h3 class="my-3">
Update Project
</h3>
{% else %}
<h3 class="my-3">
Create Project
</h3>
<p>
This form allows the creation of new projects.
</p>
{% endif %}

<div class="border border-secondary-subtle rounded-3 p-3 mb-3 mt-3">
<form action="" method="post">
{% csrf_token %}
{# Process hidden fields, we don't need to style them #}
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
{% for field in form.visible_fields %}
<div class="row mb-3">
<label for="{{ field.id_for_label }}"
class="col-12 col-md-3 form-label">{{ field.label }}</label>
{% if field.field.widget.input_type == "text" or field.field.widget.input_type == "number" or field.field.widget.input_type == "date" %}
<div class="col-12 col-md-9">
<input type="{{ field.field.widget.input_type }}" class="form-control" id="{{ field.id_for_label }}"
{% for name, value in field.field.widget.attrs.items %}
{% if value is not False %} {{ name }}{% if value is not True %}="{{ value|stringformat:'s' }}"{% endif %}{% endif %}
{% endfor %}
name="{{ field.html_name }}"
value="{% if field.value != None %}{{ field.value|stringformat:'s' }}{% endif %}"{% if field.field.required %} required{% endif %} />
{# Show field errors as a list, one per line #}
{% if field.errors %}
<div class="wam-text-danger small mt-1">
{% for error in field.errors %}
<p>{{ error|escape }}</p>
{% endfor %}
</div>
{% endif %}
</div>
{% elif field.field.widget.input_type == "select" %}
<div class="col-12 col-md-9">
<select class="form-select" id="{{ field.id_for_label }}"
{% for name, value in field.field.widget.attrs.items %}
{% if value is not False %}{{ name }}{% if value is not True %}="{{ value|stringformat:'s' }}"{% endif %}{% endif %}
{% endfor %}
name="{{ field.name }}"
value="{% if field.value != None %}{{ field.value }}{% else %}{% endif %}"
{% if field.field.widget.allow_multiple_selected %} MULTIPLE {% endif %}>
{% for option in field.field.choices %}
<option value="{{ option.0|escape }}"{% if option.0 in field.value or option.0 == field.value %} selected{% endif %}>
{{ option.1|escape }}
</option>
{% endfor %}
</select>
{% if field.field.widget.allow_multiple_selected %}
<div class="form-text mt-2">
Hold down <kbd>CTRL</kbd> or <kbd>CMD</kbd> to select multiple options
</div>
{% endif %}
{# Show field errors as a list, one per line #}
{% if field.errors %}
<div class="wam-text-danger small mt-1">
{% for error in field.errors %}
<p>{{ error|escape }}</p>
{% endfor %}
</div>
{% endif %}
</div>
{% else %}
<div class="col-12 col-md-8 form-text font-monospace">
Unknown field type: {{ field.field.widget.input_type }}
</div>
{% endif %}
</div>
{% endfor %}
<div class="row mt-4 mb-3 d-print-none">
<div class="col-6 col-md-9">
<input class="btn btn-primary me-2" type="submit" value="Submit" />
<a class="btn btn-secondary" role="button" href="{% url 'projects_index' %}">Cancel</a>
</div>
{% comment %}
{% if form.instance.pk %}
<div class="col-6 col-md-3 text-end">
<a class="btn btn-danger" role="button" href="{% url 'delete project' form.instance.pk %}">Delete project</a>
</div>
{% endif %}
{% endcomment %}
</div>

</form>
</div>

{% endblock content %}
Loading