From 216e6b06fad957610aab6f1916483a3f56975968 Mon Sep 17 00:00:00 2001 From: James Graham Date: Thu, 2 Apr 2020 16:59:54 +0100 Subject: [PATCH 1/6] fix: Make activity attendees optional --- .../0006_activity_attendance_optional.py | 18 ++++++++++++++++++ activities/models.py | 7 ++++++- 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 activities/migrations/0006_activity_attendance_optional.py diff --git a/activities/migrations/0006_activity_attendance_optional.py b/activities/migrations/0006_activity_attendance_optional.py new file mode 100644 index 0000000..0c7df33 --- /dev/null +++ b/activities/migrations/0006_activity_attendance_optional.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.10 on 2020-04-02 15:57 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('activities', '0005_shrink_name_fields_to_255'), + ] + + operations = [ + migrations.AlterField( + model_name='activity', + name='attendance_list', + field=models.ManyToManyField(blank=True, related_name='activities', to='people.Person'), + ), + ] diff --git a/activities/models.py b/activities/models.py index 134bc97..cd49770 100644 --- a/activities/models.py +++ b/activities/models.py @@ -1,4 +1,5 @@ from django.db import models +from django.urls import reverse from people import models as people_models @@ -88,7 +89,11 @@ class Activity(models.Model): #: Who attended this activity? attendance_list = models.ManyToManyField(people_models.Person, - related_name='activities') + related_name='activities', + blank=True) + + def get_absolute_url(self): + return reverse('activities:activity.detail', kwargs={'pk': self.pk}) def __str__(self) -> str: return self.name From fef6e9d459ea5bd37fad4b4163d75a9454b84915 Mon Sep 17 00:00:00 2001 From: James Graham Date: Thu, 2 Apr 2020 17:02:27 +0100 Subject: [PATCH 2/6] feat: Users can create Activities Resolves #22 --- activities/forms.py | 14 ++++++++++ .../templates/activities/activity/create.html | 27 +++++++++++++++++++ .../templates/activities/activity/list.html | 3 +++ activities/urls.py | 4 +++ activities/views.py | 13 +++++++-- 5 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 activities/forms.py create mode 100644 activities/templates/activities/activity/create.html diff --git a/activities/forms.py b/activities/forms.py new file mode 100644 index 0000000..cf7a22d --- /dev/null +++ b/activities/forms.py @@ -0,0 +1,14 @@ +from django import forms + +from . import models + + +class ActivityForm(forms.ModelForm): + class Meta: + model = models.Activity + fields = [ + 'name', + 'series', + 'type', + 'medium', + ] diff --git a/activities/templates/activities/activity/create.html b/activities/templates/activities/activity/create.html new file mode 100644 index 0000000..b5c55a3 --- /dev/null +++ b/activities/templates/activities/activity/create.html @@ -0,0 +1,27 @@ +{% extends 'base.html' %} + +{% block content %} + + +
+ +
+ {% csrf_token %} + + {% load bootstrap4 %} + {% bootstrap_form form %} + + {% buttons %} + + {% endbuttons %} +
+ +{% endblock %} diff --git a/activities/templates/activities/activity/list.html b/activities/templates/activities/activity/list.html index 041320c..956610d 100644 --- a/activities/templates/activities/activity/list.html +++ b/activities/templates/activities/activity/list.html @@ -9,6 +9,9 @@
+ New Activity + diff --git a/activities/urls.py b/activities/urls.py index c86fbdf..20cc490 100644 --- a/activities/urls.py +++ b/activities/urls.py @@ -14,6 +14,10 @@ urlpatterns = [ views.ActivitySeriesDetailView.as_view(), name='activity-series.detail'), + path('activities/create', + views.ActivityCreateView.as_view(), + name='activity.create'), + path('activities', views.ActivityListView.as_view(), name='activity.list'), diff --git a/activities/views.py b/activities/views.py index 72b2d55..ec9b0e6 100644 --- a/activities/views.py +++ b/activities/views.py @@ -5,12 +5,12 @@ import json from django.contrib.auth.mixins import LoginRequiredMixin from django.http import HttpResponse -from django.views.generic import DetailView, ListView, View +from django.views.generic import CreateView, DetailView, ListView, View from django.views.generic.detail import SingleObjectMixin from people import models as people_models from people import permissions -from . import models +from . import forms, models class ActivitySeriesListView(LoginRequiredMixin, ListView): @@ -29,6 +29,15 @@ class ActivitySeriesDetailView(LoginRequiredMixin, DetailView): model = models.ActivitySeries template_name = 'activities/activity_series/detail.html' context_object_name = 'activity_series' + + +class ActivityCreateView(LoginRequiredMixin, CreateView): + """ + View to create a new instance of :class:`Activity`. + """ + model = models.Activity + template_name = 'activities/activity/create.html' + form_class = forms.ActivityForm class ActivityListView(LoginRequiredMixin, ListView): From c7a6c722197180ab318f6ef3df74e15fd3fd8a77 Mon Sep 17 00:00:00 2001 From: James Graham Date: Thu, 2 Apr 2020 17:15:27 +0100 Subject: [PATCH 3/6] fix: Fix broken activity signup --- activities/templates/activities/activity/detail.html | 2 ++ activities/views.py | 7 +++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/activities/templates/activities/activity/detail.html b/activities/templates/activities/activity/detail.html index 5e1901d..40a3ceb 100644 --- a/activities/templates/activities/activity/detail.html +++ b/activities/templates/activities/activity/detail.html @@ -39,6 +39,8 @@
+

Attendance

+
diff --git a/activities/views.py b/activities/views.py index ec9b0e6..a2af88b 100644 --- a/activities/views.py +++ b/activities/views.py @@ -74,14 +74,13 @@ class ActivityAttendanceView(permissions.UserIsLinkedPersonMixin, SingleObjectMi def get_test_person(self) -> people_models.Person: data = json.loads(self.request.body) - self.person = people_models.Person.objects.get(pk=data['pk']) - return self.person + return people_models.Person.objects.get(pk=data['pk']) def post(self, request, *args, **kwargs): self.object = self.get_object() if request.is_ajax(): - self.object.attendance_list.add(self.person) + self.object.attendance_list.add(self.get_test_person()) return HttpResponse(status=204) @@ -91,7 +90,7 @@ class ActivityAttendanceView(permissions.UserIsLinkedPersonMixin, SingleObjectMi self.object = self.get_object() if request.is_ajax(): - self.object.attendance_list.remove(self.person) + self.object.attendance_list.remove(self.get_test_person()) return HttpResponse(status=204) From eea434245525220fe77c45f37b5a9d4ea68dcfae Mon Sep 17 00:00:00 2001 From: James Graham Date: Thu, 2 Apr 2020 18:35:24 +0100 Subject: [PATCH 4/6] fix: Add heading to all pages --- activities/templates/activities/activity/create.html | 2 ++ activities/templates/activities/activity/detail.html | 2 ++ activities/templates/activities/activity/list.html | 2 ++ activities/templates/activities/activity_series/detail.html | 2 ++ activities/templates/activities/activity_series/list.html | 2 ++ export/templates/export/export.html | 2 ++ people/templates/people/network.html | 2 ++ people/templates/people/person/create.html | 2 ++ people/templates/people/person/detail.html | 4 +++- people/templates/people/person/list.html | 2 ++ people/templates/people/person/update.html | 2 ++ people/templates/people/relationship/create.html | 2 ++ people/templates/people/relationship/detail.html | 2 ++ people/templates/people/relationship/update.html | 2 ++ 14 files changed, 29 insertions(+), 1 deletion(-) diff --git a/activities/templates/activities/activity/create.html b/activities/templates/activities/activity/create.html index b5c55a3..5910e7c 100644 --- a/activities/templates/activities/activity/create.html +++ b/activities/templates/activities/activity/create.html @@ -10,6 +10,8 @@ +

New Activity

+
+

{{ activity.name }}

+ {% if user_is_attending %}
diff --git a/export/templates/export/export.html b/export/templates/export/export.html index 47ce026..c94b2df 100644 --- a/export/templates/export/export.html +++ b/export/templates/export/export.html @@ -7,6 +7,8 @@ +

Export Data

+
diff --git a/people/templates/people/network.html b/people/templates/people/network.html index e0e3deb..144a27a 100644 --- a/people/templates/people/network.html +++ b/people/templates/people/network.html @@ -7,6 +7,8 @@ +

Network View

+
+

New Person

+
-

{{ person }}

+

{{ person.name }}

+ +
{% if person.gender %} diff --git a/people/templates/people/person/list.html b/people/templates/people/person/list.html index a5848d5..6dfa8da 100644 --- a/people/templates/people/person/list.html +++ b/people/templates/people/person/list.html @@ -7,6 +7,8 @@ +

People

+
{% if request.user.is_staff %} diff --git a/people/templates/people/person/update.html b/people/templates/people/person/update.html index 1399503..980f5a9 100644 --- a/people/templates/people/person/update.html +++ b/people/templates/people/person/update.html @@ -13,6 +13,8 @@ +

{{ person.name }}

+
+

New Relationship

+
+

Relationship

+
diff --git a/people/templates/people/relationship/update.html b/people/templates/people/relationship/update.html index 562dc8b..bd3bff1 100644 --- a/people/templates/people/relationship/update.html +++ b/people/templates/people/relationship/update.html @@ -16,6 +16,8 @@ +

Update Relationship

+
Date: Thu, 2 Apr 2020 18:40:11 +0100 Subject: [PATCH 5/6] refactor: Simplify User person test --- people/models/person.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/people/models/person.py b/people/models/person.py index f0af4b8..03f0f95 100644 --- a/people/models/person.py +++ b/people/models/person.py @@ -1,5 +1,3 @@ -import typing - from django.conf import settings from django.contrib.auth.models import AbstractUser from django.db import models @@ -28,12 +26,7 @@ class User(AbstractUser): """ Does this user have a linked :class:`Person` record? """ - try: - person = self.person - return True - - except AttributeError: - return False + return hasattr(self, 'person') class Organisation(models.Model): From 224a92f42e382e3e263096cf8a0840a3592b0034 Mon Sep 17 00:00:00 2001 From: James Graham Date: Thu, 2 Apr 2020 19:09:28 +0100 Subject: [PATCH 6/6] style: Fix a few minor style issues --- .gitignore | 5 ++++- export/serializers/activities.py | 1 - people/forms.py | 15 ++++++++++++--- people/models/person.py | 2 -- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 0d631fd..848c6b0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,10 @@ -# IDE files +# IDEs .idea/ .vscode/ +# Tools +.mypy_cache/ + # Runtime /static/ venv/ diff --git a/export/serializers/activities.py b/export/serializers/activities.py index db91387..3a46e0d 100644 --- a/export/serializers/activities.py +++ b/export/serializers/activities.py @@ -74,4 +74,3 @@ class ActivityAttendanceSerializer(base.FlattenedModelSerializer): 'activity', 'person', ] - diff --git a/people/forms.py b/people/forms.py index e883607..d230fbb 100644 --- a/people/forms.py +++ b/people/forms.py @@ -14,9 +14,18 @@ class PersonForm(forms.ModelForm): """ class Meta: model = models.Person - exclude = [ - 'user', - 'relationship_targets', + fields = [ + 'name', + 'core_member', + 'gender', + 'age_group', + 'nationality', + 'country_of_residence', + 'organisation', + 'job_title', + 'discipline', + 'role', + 'themes', ] widgets = { 'nationality': Select2Widget(), diff --git a/people/models/person.py b/people/models/person.py index 03f0f95..10efe56 100644 --- a/people/models/person.py +++ b/people/models/person.py @@ -175,5 +175,3 @@ class Person(models.Model): def __str__(self) -> str: return self.name - -