From db2a483747b59e388ebf79cc69b365754d837f75 Mon Sep 17 00:00:00 2001 From: Jack Lin Date: Mon, 12 Jul 2021 09:29:21 -0700 Subject: [PATCH 1/8] move attendees page --- README.md | 4 +- attendees/persons/urls.py | 2 +- fixtures/db_seed.json | 130 ++++++++++++++++++++++++++++---------- 3 files changed, 101 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index 71744aae..3aaa4f23 100644 --- a/README.md +++ b/README.md @@ -117,8 +117,8 @@ All libraries are included to facilitate offline development - [x] [PR#8](https://github.com/xjlin0/attendees30/pull/8) implement secret/private relation/past general - [ ] Move attendee/attendees page out of data assembly -- some coworkers need to see all attendees of the organization, with a way to see only family members for general users - [x] [PR#17](https://github.com/xjlin0/attendees30/pull/17) remove all previous attendee edit testing pages - - [x] remove attendee list page dependency of path params and take search params from user for assembly slug - - [ ] rename and move attendees/attendee page, and show attendees based on auth groups + - [x] [PR#18](https://github.com/xjlin0/attendees30/pull/18) remove attendee list page dependency of path params and take search params from user for assembly slug + - [x] [PR#19](https://github.com/xjlin0/attendees30/pull/19) rename and move attendees/attendee page, and show attendees based on auth groups - [ ] Gathering list (server side processing with auto-generation) - [ ] Attendance list (server side processing with auto-generation) - [ ] member list (attendance level with editing category) diff --git a/attendees/persons/urls.py b/attendees/persons/urls.py index 631f6ddc..eb55b134 100644 --- a/attendees/persons/urls.py +++ b/attendees/persons/urls.py @@ -126,7 +126,7 @@ ), path( - "//datagrid_assembly_data_attendees/", + "datagrid_assembly_data_attendees/", view=datagrid_assembly_data_attendees_list_view, name="datagrid_assembly_data_attendees", ), diff --git a/fixtures/db_seed.json b/fixtures/db_seed.json index f3fd2178..af98d615 100644 --- a/fixtures/db_seed.json +++ b/fixtures/db_seed.json @@ -829,7 +829,7 @@ "aria-haspopup": "true" }, "lft": 1, - "rght": 22, + "rght": 24, "tree_id": 8, "level": 0 } @@ -853,8 +853,8 @@ "class": "dropdown-item", "title": "Coworkers attendance" }, - "lft": 20, - "rght": 21, + "lft": 22, + "rght": 23, "tree_id": 8, "level": 1 } @@ -878,8 +878,8 @@ "class": "dropdown-item", "title": "My (families) attendance" }, - "lft": 18, - "rght": 19, + "lft": 20, + "rght": 21, "tree_id": 8, "level": 1 } @@ -930,8 +930,8 @@ "infos": { "class": "dropdown-item" }, - "lft": 14, - "rght": 15, + "lft": 16, + "rght": 17, "tree_id": 8, "level": 1 } @@ -1004,8 +1004,8 @@ "infos": { "class": "dropdown-divider" }, - "lft": 16, - "rght": 17, + "lft": 18, + "rght": 19, "tree_id": 8, "level": 1 } @@ -1057,7 +1057,7 @@ "aria-haspopup": "true" }, "lft": 1, - "rght": 8, + "rght": 6, "tree_id": 10, "level": 0 } @@ -1081,8 +1081,8 @@ "class": "dropdown-item", "title": "roaster list" }, - "lft": 6, - "rght": 7, + "lft": 4, + "rght": 5, "tree_id": 10, "level": 1 } @@ -1106,8 +1106,8 @@ "class": "dropdown-item", "title": "congregation attending" }, - "lft": 4, - "rght": 5, + "lft": 2, + "rght": 3, "tree_id": 10, "level": 1 } @@ -1117,23 +1117,23 @@ "pk": 15, "fields": { "created": "2020-11-20T16:12:21.803Z", - "modified": "2021-07-09T16:11:51.590Z", + "modified": "2021-07-12T16:18:03.890Z", "is_removed": false, "organization": 1, "category": "main", - "parent": 12, + "parent": 1, "html_type": "a", - "urn": "/persons/cfcch_data_management/cfcch_congregation_data/datagrid_assembly_data_attendees/", + "urn": "/persons/datagrid_assembly_data_attendees/", "url_name": "datagrid_assembly_data_attendees", - "display_name": "\u4ed6\u4eba\u8cc7\u6599 others info", - "display_order": 3100, + "display_name": "others info \u4ed6\u4eba\u8cc7\u6599", + "display_order": 1000, "infos": { "class": "dropdown-item", "title": "congregation attendee data" }, - "lft": 2, - "rght": 3, - "tree_id": 10, + "lft": 14, + "rght": 15, + "tree_id": 8, "level": 1 } }, @@ -1142,7 +1142,7 @@ "pk": 19, "fields": { "created": "2020-12-14T04:43:29Z", - "modified": "2021-07-09T15:37:03.753Z", + "modified": "2021-07-11T14:51:51.455Z", "is_removed": false, "organization": 1, "category": "sublink", @@ -1255,7 +1255,7 @@ "pk": 24, "fields": { "created": "2021-07-03T19:11:57.123Z", - "modified": "2021-07-09T15:19:42.525Z", + "modified": "2021-07-11T14:52:14.759Z", "is_removed": false, "organization": 1, "category": "sublink", @@ -1277,7 +1277,7 @@ "pk": 25, "fields": { "created": "2021-07-09T15:35:48.091Z", - "modified": "2021-07-09T16:11:12.824Z", + "modified": "2021-07-11T14:31:45.637Z", "is_removed": false, "organization": 1, "category": "main", @@ -1311,7 +1311,6 @@ "opencc_convert": true, "attendance_character_to_past_categories": {} }, - "groups_see_all_meets_attendees": [], "contacts": {}, "hostname": "organization.none", "counselor": [], @@ -1324,7 +1323,7 @@ "pk": 1, "fields": { "created": "2020-04-11T18:15:06.495Z", - "modified": "2021-04-08T13:57:30.446Z", + "modified": "2021-07-12T15:56:14.460Z", "is_removed": false, "slug": "d7c8Fd_cfcc_hayward", "display_name": "Chinese for Christ Church of Hayward", @@ -1343,6 +1342,9 @@ "data_admins": [ "data_organizer" ], + "all_access_assemblies": [ + "cfcch_congregation_data" + ], "groups_see_all_meets_attendees": [ "data_counselor", "data_organizer", @@ -1350,7 +1352,7 @@ "children_organizer", "children_coworker", "conference_organizer", - "conference_coworker" + "conference_coworker" ] } } @@ -1369,7 +1371,6 @@ "opencc_convert": true, "attendance_character_to_past_categories": {} }, - "groups_see_all_meets_attendees": [], "contacts": {}, "hostname": "heaven.heaven", "counselor": [], @@ -2115,7 +2116,7 @@ "pk": 4, "fields": { "created": "2021-05-23T12:56:31.387Z", - "modified": "2021-05-23T12:59:36.666Z", + "modified": "2021-07-12T16:20:11.182Z", "is_removed": false, "type": "status", "display_order": 0, @@ -8566,6 +8567,71 @@ "menu": 25 } }, + { + "model": "users.menuauthgroup", + "pk": 77, + "fields": { + "created": "2021-07-12T16:16:59.333Z", + "modified": "2021-07-12T16:16:59.333Z", + "is_removed": false, + "auth_group": 1, + "read": true, + "write": true, + "menu": 15 + } + }, + { + "model": "users.menuauthgroup", + "pk": 78, + "fields": { + "created": "2021-07-12T16:16:59.334Z", + "modified": "2021-07-12T16:16:59.334Z", + "is_removed": false, + "auth_group": 5, + "read": true, + "write": true, + "menu": 15 + } + }, + { + "model": "users.menuauthgroup", + "pk": 79, + "fields": { + "created": "2021-07-12T16:16:59.337Z", + "modified": "2021-07-12T16:16:59.337Z", + "is_removed": false, + "auth_group": 6, + "read": true, + "write": true, + "menu": 15 + } + }, + { + "model": "users.menuauthgroup", + "pk": 80, + "fields": { + "created": "2021-07-12T16:16:59.339Z", + "modified": "2021-07-12T16:16:59.339Z", + "is_removed": false, + "auth_group": 2, + "read": true, + "write": true, + "menu": 15 + } + }, + { + "model": "users.menuauthgroup", + "pk": 81, + "fields": { + "created": "2021-07-12T16:16:59.341Z", + "modified": "2021-07-12T16:16:59.341Z", + "is_removed": false, + "auth_group": 3, + "read": true, + "write": true, + "menu": 15 + } + }, { "model": "whereabouts.division", "pk": 0, @@ -9082,7 +9148,7 @@ "pk": "aa24758f-cc70-4353-b1d7-9c616b3db425", "fields": { "created": "1999-04-11T19:38:16.323Z", - "modified": "2021-07-03T21:39:40.802Z", + "modified": "2021-07-11T14:55:53.581Z", "is_removed": false, "division": 1, "user": null, @@ -9094,7 +9160,7 @@ "actual_birthday": null, "estimated_birthday": null, "deathday": null, - "photo": "", + "photo": "attendee_portrait/Rembrandt_Harmensz._van_Rijn__Abraham_ZsVZoFY.jpg", "progressions": {}, "infos": { "fixed": { From 9ac5a9dc9156e18ea055c5b48614bf756bc9e43c Mon Sep 17 00:00:00 2001 From: Jack Lin Date: Thu, 15 Jul 2021 09:02:10 -0700 Subject: [PATCH 2/8] moved datagrid_attendee_update_view to attendee_update_view, but create new attendee break --- attendees/persons/urls.py | 20 +++++++++---------- attendees/persons/views/__init__.py | 2 +- ...update_view.py => attendee_update_view.py} | 6 +++--- .../page/datagrid_assembly_data_attendees.py | 4 ++-- ...update_view.js => attendee_update_view.js} | 2 +- ...te_view.html => attendee_update_view.html} | 2 +- attendees/users/models/menu.py | 2 +- 7 files changed, 19 insertions(+), 19 deletions(-) rename attendees/persons/views/page/{datagrid_attendee_update_view.py => attendee_update_view.py} (94%) rename attendees/static/js/persons/{datagrid_attendee_update_view.js => attendee_update_view.js} (99%) rename attendees/templates/persons/{datagrid_attendee_update_view.html => attendee_update_view.html} (98%) diff --git a/attendees/persons/urls.py b/attendees/persons/urls.py index eb55b134..24e17f82 100644 --- a/attendees/persons/urls.py +++ b/attendees/persons/urls.py @@ -19,7 +19,7 @@ datagrid_assembly_all_attendings_list_view, datagrid_assembly_data_attendees_list_view, datagrid_assembly_data_attendings_list_view, - datagrid_attendee_update_view, + attendee_update_view, api_attendee_attendings_viewset, api_user_meet_attendings_viewset, api_family_organization_attendings_viewset, @@ -138,19 +138,19 @@ ), path( - 'datagrid_attendee_update_view/self', - view=datagrid_attendee_update_view, - name='datagrid_attendee_update_self', # null attendee_id will be replaced by request.user's attendee_id + 'attendee/self', + view=attendee_update_view, + name='attendee_update_self', # null attendee_id will be replaced by request.user's attendee_id ), path( - 'datagrid_attendee_update_view/new', + 'attendee/new', kwargs={'attendee_id': 'new', 'can_create_nonfamily_attendee': False}, - view=datagrid_attendee_update_view, - name='datagrid_attendee_create_view', # for create non-family-attendee permission + view=attendee_update_view, + name='attendee_create_view', # for create non-family-attendee permission ), path( - 'datagrid_attendee_update_view/', - view=datagrid_attendee_update_view, - name='datagrid_attendee_update_view', + 'attendee/', + view=attendee_update_view, + name='attendee_update_view', ), ] diff --git a/attendees/persons/views/__init__.py b/attendees/persons/views/__init__.py index bd2378f7..c7685b5b 100644 --- a/attendees/persons/views/__init__.py +++ b/attendees/persons/views/__init__.py @@ -16,6 +16,6 @@ from .page.datagrid_assembly_all_attendings import datagrid_assembly_all_attendings_list_view from .page.datagrid_assembly_data_attendees import datagrid_assembly_data_attendees_list_view from .page.datagrid_assembly_data_attendings import datagrid_assembly_data_attendings_list_view -from .page.datagrid_attendee_update_view import datagrid_attendee_update_view +from .page.attendee_update_view import attendee_update_view from .api.user_meet_attendings import api_user_meet_attendings_viewset from .api.family_organization_attendings import api_family_organization_attendings_viewset diff --git a/attendees/persons/views/page/datagrid_attendee_update_view.py b/attendees/persons/views/page/attendee_update_view.py similarity index 94% rename from attendees/persons/views/page/datagrid_attendee_update_view.py rename to attendees/persons/views/page/attendee_update_view.py index b41c761a..d1b88a4f 100644 --- a/attendees/persons/views/page/datagrid_attendee_update_view.py +++ b/attendees/persons/views/page/attendee_update_view.py @@ -13,10 +13,10 @@ from attendees.utils.view_helpers import get_object_or_delayed_403 -class DatagridAttendeeUpdateView(LoginRequiredMixin, RouteAndSpyGuard, UpdateView): +class AttendeeUpdateView(LoginRequiredMixin, RouteAndSpyGuard, UpdateView): model = Attendee fields = '__all__' - template_name = 'persons/datagrid_attendee_update_view.html' + template_name = 'persons/attendee_update_view.html' def get_object(self, queryset=None): # queryset = self.get_queryset() if queryset is None else queryset @@ -75,5 +75,5 @@ def render_to_response(self, context, **kwargs): raise Http404('Have you registered any events of the organization?') -datagrid_attendee_update_view = DatagridAttendeeUpdateView.as_view() +attendee_update_view = AttendeeUpdateView.as_view() diff --git a/attendees/persons/views/page/datagrid_assembly_data_attendees.py b/attendees/persons/views/page/datagrid_assembly_data_attendees.py index f94bf30b..3b2fbaa8 100644 --- a/attendees/persons/views/page/datagrid_assembly_data_attendees.py +++ b/attendees/persons/views/page/datagrid_assembly_data_attendees.py @@ -32,7 +32,7 @@ def get_context_data(self, **kwargs): 'family_attendances_urn': family_attendances_menu.urn if family_attendances_menu else None, 'available_meets_json': dumps(list(available_meets)), 'allowed_to_create_attendee': allowed_to_create_attendee, - 'create_attendee_urn': f'/persons/datagrid_attendee_update_view/new', + 'create_attendee_urn': f'/persons/attendee/new', }) return context @@ -47,7 +47,7 @@ def render_to_response(self, context, **kwargs): # view only provides empty tab context.update({'divisions_endpoint': f"/whereabouts/api/user_divisions/"}) # context.update({'teams_endpoint': f"/occasions/api/{context['current_division_slug']}/{context['current_assembly_slug']}/assembly_meet_teams/"}) # context.update({'attendees_endpoint': f"/persons/api/{context['current_division_slug']}/{context['current_assembly_slug']}/assembly_meet_attendees/"}) - context.update({'attendee_urn': f"/persons/datagrid_attendee_update_view/"}) + context.update({'attendee_urn': f"/persons/attendee/"}) # context.update({'gatherings_endpoint': f"/occasions/api/{context['current_division_slug']}/{context['current_assembly_slug']}/assembly_meet_gatherings/"}) # context.update({'characters_endpoint': f"/occasions/api/{context['current_division_slug']}/{context['current_assembly_slug']}/assembly_meet_characters/"}) # context.update({'attendings_endpoint': f"/persons/api/{context['current_division_slug']}/{context['current_assembly_slug']}/data_attendings/"}) diff --git a/attendees/static/js/persons/datagrid_attendee_update_view.js b/attendees/static/js/persons/attendee_update_view.js similarity index 99% rename from attendees/static/js/persons/datagrid_attendee_update_view.js rename to attendees/static/js/persons/attendee_update_view.js index 90fb43f6..04e462cc 100644 --- a/attendees/static/js/persons/datagrid_attendee_update_view.js +++ b/attendees/static/js/persons/attendee_update_view.js @@ -50,7 +50,7 @@ Attendees.datagridUpdate = { }, init: () => { - console.log('/static/js/persons/datagrid_attendee_update_view.js'); + console.log('/static/js/persons/attendee_update_view.js'); Attendees.datagridUpdate.displayNotifierFromSearchParam('success'); Attendees.datagridUpdate.initAttendeeForm(); }, diff --git a/attendees/templates/persons/datagrid_attendee_update_view.html b/attendees/templates/persons/attendee_update_view.html similarity index 98% rename from attendees/templates/persons/datagrid_attendee_update_view.html rename to attendees/templates/persons/attendee_update_view.html index 89d74fb7..c59c765b 100644 --- a/attendees/templates/persons/datagrid_attendee_update_view.html +++ b/attendees/templates/persons/attendee_update_view.html @@ -26,7 +26,7 @@ {% endblock extra_head %} diff --git a/attendees/users/models/menu.py b/attendees/users/models/menu.py index c472e4de..a35572e6 100644 --- a/attendees/users/models/menu.py +++ b/attendees/users/models/menu.py @@ -7,7 +7,7 @@ class Menu(MPTTModel, TimeStampedModel, SoftDeletableModel): - CREATE_VIEW_NAME = 'datagrid_attendee_create_view' + CREATE_VIEW_NAME = 'attendee_create_view' id = models.BigAutoField( auto_created=True, From a5d2af1cf942ec952ab5b170347a496ffd3d4201 Mon Sep 17 00:00:00 2001 From: Jack Lin Date: Thu, 15 Jul 2021 11:12:10 -0700 Subject: [PATCH 3/8] create new attendee now work --- README.md | 9 +++++++++ attendees/persons/models/attendee.py | 8 ++++++++ attendees/persons/urls.py | 3 ++- attendees/persons/views/api/attendee_attendings.py | 2 +- attendees/persons/views/page/attendee_update_view.py | 10 +++++----- attendees/templates/persons/attendee_update_view.html | 2 +- attendees/users/authorization/route_guard.py | 8 +++++--- attendees/users/models/menu.py | 4 ++-- 8 files changed, 33 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 3aaa4f23..7fdd937d 100644 --- a/README.md +++ b/README.md @@ -137,3 +137,12 @@ All libraries are included to facilitate offline development - [ ] i18n Translation on model data, django-parler maybe? + +## Issues: + +
+ Click to expand all + +- [ ] for ordinary users: + -[ ] even as scheduler seeing other's attendee detail view, the joined meet doesn't show group name (i.e. Hagar cannot see Ishmael in "the Rock") +
diff --git a/attendees/persons/models/attendee.py b/attendees/persons/models/attendee.py index 497117f9..32f8a902 100644 --- a/attendees/persons/models/attendee.py +++ b/attendees/persons/models/attendee.py @@ -88,6 +88,14 @@ def under_same_org_with(self, other_attendee_id): return Attendee.objects.filter(pk=other_attendee_id, division__organization=self.division.organization).exists() return False + def can_schedule_attendee(self, other_attendee_id): + return self.__class__.objects.filter( + from_attendee__to_attendee__id=self.id, + from_attendee__from_attendee__id=other_attendee_id, + from_attendee__scheduler=True, + from_attendee__is_removed=False, + ).exists() + def scheduling_attendees(self): """ :return: all attendees that can be scheduled by the self(included) based on relationships. For example, if a kid diff --git a/attendees/persons/urls.py b/attendees/persons/urls.py index 24e17f82..64934ed1 100644 --- a/attendees/persons/urls.py +++ b/attendees/persons/urls.py @@ -139,12 +139,13 @@ path( 'attendee/self', + kwargs={'myself': True}, view=attendee_update_view, name='attendee_update_self', # null attendee_id will be replaced by request.user's attendee_id ), path( 'attendee/new', - kwargs={'attendee_id': 'new', 'can_create_nonfamily_attendee': False}, + kwargs={'attendee_id': 'new', 'show_create_nonfamily_attendee': False}, view=attendee_update_view, name='attendee_create_view', # for create non-family-attendee permission ), diff --git a/attendees/persons/views/api/attendee_attendings.py b/attendees/persons/views/api/attendee_attendings.py index 22c0fa1c..ad53f5e0 100644 --- a/attendees/persons/views/api/attendee_attendings.py +++ b/attendees/persons/views/api/attendee_attendings.py @@ -21,7 +21,7 @@ def get_queryset(self): current_user_organization = self.request.user.organization is_self = current_user_organization and self.request.user.attendee and self.request.user.attendee == target_attendee is_privileged = current_user_organization and self.request.user.privileged() - if target_attendee and (is_self or is_privileged): # Todo: scheduler should be able to do it too + if target_attendee and (is_self or is_privileged or self.request.user.attendee.can_schedule_attendee(target_attendee.id)): attending_id = self.kwargs.get('pk') qs = Attending.objects.filter( attendee=target_attendee, diff --git a/attendees/persons/views/page/attendee_update_view.py b/attendees/persons/views/page/attendee_update_view.py index d1b88a4f..83311164 100644 --- a/attendees/persons/views/page/attendee_update_view.py +++ b/attendees/persons/views/page/attendee_update_view.py @@ -32,12 +32,12 @@ def get_context_data(self, **kwargs): # current_assembly_slug = self.kwargs.get('assembly_slug', 'cfcch_unspecified') # current_assembly_id = Assembly.objects.get(slug=current_assembly_slug).id targeting_attendee_id = self.kwargs.get('attendee_id', self.request.user.attendee_uuid_str()) # if more logic needed when create new, a new view will be better - can_create_nonfamily_attendee = self.kwargs.get('can_create_nonfamily_attendee', Menu.user_can_create_attendee(self.request.user)) + show_create_nonfamily_attendee = self.kwargs.get('show_create_nonfamily_attendee', Menu.user_can_create_attendee(self.request.user)) context.update({ 'attendee_contenttype_id': ContentType.objects.get_for_model(Attendee).id, 'family_contenttype_id': ContentType.objects.get_for_model(Family).id, 'empty_image_link': f"{settings.STATIC_URL}images/empty.png", - 'can_create_nonfamily_attendee': can_create_nonfamily_attendee, + 'show_create_nonfamily_attendee': show_create_nonfamily_attendee, 'characters_endpoint': '/occasions/api/user_assembly_characters/', 'meets_endpoint': '/occasions/api/user_assembly_meets/', 'attendingmeets_endpoint': '/persons/api/datagrid_data_attendingmeet/', @@ -58,12 +58,12 @@ def get_context_data(self, **kwargs): # 'current_organization_slug': current_organization_slug, # 'current_division_slug': current_division_slug, # 'current_assembly_id': current_assembly_id, - 'attendee_urn': f"/persons/datagrid_attendee_update_view/", + 'attendee_urn': f"/persons/attendee/", }) return context - def render_to_response(self, context, **kwargs): - if self.request.user.attendee.under_same_org_with(context['targeting_attendee_id']): + def render_to_response(self, context, **kwargs): # attendee_id "new" only happened in attendee_create_view checked by RouteAndSpyGuard + if context['targeting_attendee_id'] == 'new' or self.request.user.attendee.under_same_org_with(context['targeting_attendee_id']): if self.request.is_ajax(): pass diff --git a/attendees/templates/persons/attendee_update_view.html b/attendees/templates/persons/attendee_update_view.html index c59c765b..1b42969b 100644 --- a/attendees/templates/persons/attendee_update_view.html +++ b/attendees/templates/persons/attendee_update_view.html @@ -44,7 +44,7 @@

- {% if can_create_nonfamily_attendee %} + {% if show_create_nonfamily_attendee %} Date: Thu, 15 Jul 2021 11:14:04 -0700 Subject: [PATCH 4/8] change new view name in seed data --- fixtures/db_seed.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/fixtures/db_seed.json b/fixtures/db_seed.json index af98d615..61a89330 100644 --- a/fixtures/db_seed.json +++ b/fixtures/db_seed.json @@ -1142,14 +1142,14 @@ "pk": 19, "fields": { "created": "2020-12-14T04:43:29Z", - "modified": "2021-07-11T14:51:51.455Z", + "modified": "2021-07-15T15:41:44.030Z", "is_removed": false, "organization": 1, "category": "sublink", "parent": 1, "html_type": "permission", - "urn": "/persons/datagrid_attendee_update_view/", - "url_name": "datagrid_attendee_update_view", + "urn": "/persons/attendee/", + "url_name": "attendee_update_view", "display_name": "update attendee \u66f4\u65b0\u4ed6\u4eba", "display_order": 725, "infos": { @@ -1255,14 +1255,14 @@ "pk": 24, "fields": { "created": "2021-07-03T19:11:57.123Z", - "modified": "2021-07-11T14:52:14.759Z", + "modified": "2021-07-15T15:40:52.026Z", "is_removed": false, "organization": 1, "category": "sublink", "parent": 1, "html_type": "permission", - "urn": "/persons/datagrid_attendee_update_view/new", - "url_name": "datagrid_attendee_create_view", + "urn": "/persons/attendee/new", + "url_name": "attendee_create_view", "display_name": "create attendee \u53e6\u5efa\u65b0\u4eba", "display_order": 730, "infos": {}, @@ -1277,14 +1277,14 @@ "pk": 25, "fields": { "created": "2021-07-09T15:35:48.091Z", - "modified": "2021-07-11T14:31:45.637Z", + "modified": "2021-07-15T15:40:17.718Z", "is_removed": false, "organization": 1, "category": "main", "parent": 1, "html_type": "a", - "urn": "/persons/datagrid_attendee_update_view/self", - "url_name": "datagrid_attendee_update_self", + "urn": "/persons/attendee/self", + "url_name": "attendee_update_self", "display_name": "self info \u81ea\u8eab\u8cc7\u6599", "display_order": 726, "infos": { From 9e327249d395c0d535e7608ccda87eea56411d23 Mon Sep 17 00:00:00 2001 From: Jack Lin Date: Thu, 15 Jul 2021 11:28:58 -0700 Subject: [PATCH 5/8] improved Attendee.can_schedule_attendee() and scheduling_attendees() by relationship end date --- attendees/persons/models/attendee.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/attendees/persons/models/attendee.py b/attendees/persons/models/attendee.py index 32f8a902..2fa7ea0c 100644 --- a/attendees/persons/models/attendee.py +++ b/attendees/persons/models/attendee.py @@ -89,7 +89,10 @@ def under_same_org_with(self, other_attendee_id): return False def can_schedule_attendee(self, other_attendee_id): + if str(self.id) == other_attendee_id: + return True return self.__class__.objects.filter( + (Q(from_attendee__finish__isnull=True) | Q(from_attendee__finish__gt=Utility.now_with_timezone())), from_attendee__to_attendee__id=self.id, from_attendee__from_attendee__id=other_attendee_id, from_attendee__scheduler=True, @@ -105,7 +108,12 @@ def scheduling_attendees(self): return self.__class__.objects.filter( Q(id=self.id) | - Q(from_attendee__to_attendee__id=self.id, from_attendee__scheduler=True) + Q( + (Q(from_attendee__finish__isnull=True) | Q(from_attendee__finish__gt=Utility.now_with_timezone())), + from_attendee__to_attendee__id=self.id, + from_attendee__scheduler=True, + from_attendee__is_removed=False, + ) ).distinct() @cached_property From 17a6a254f94962767f019d5f121a5bcb1e27962e Mon Sep 17 00:00:00 2001 From: Jack Lin Date: Sat, 17 Jul 2021 11:33:44 -0700 Subject: [PATCH 6/8] move attendees_list_view page and fixed column advanced searching conditions such as equal/not contains --- attendees/persons/services/attendee_service.py | 8 +++++++- attendees/persons/urls.py | 8 ++++---- attendees/persons/views/__init__.py | 2 +- ..._assembly_data_attendees.py => attendees_list_view.py} | 6 +++--- ..._assembly_data_attendees.js => attendees_list_view.js} | 2 +- ...embly_data_attendees.html => attendees_list_view.html} | 2 +- 6 files changed, 17 insertions(+), 11 deletions(-) rename attendees/persons/views/page/{datagrid_assembly_data_attendees.py => attendees_list_view.py} (94%) rename attendees/static/js/persons/{datagrid_assembly_data_attendees.js => attendees_list_view.js} (98%) rename attendees/templates/persons/{datagrid_assembly_data_attendees.html => attendees_list_view.html} (96%) diff --git a/attendees/persons/services/attendee_service.py b/attendees/persons/services/attendee_service.py index 2fa21889..66c57e21 100644 --- a/attendees/persons/services/attendee_service.py +++ b/attendees/persons/services/attendee_service.py @@ -173,9 +173,15 @@ def filter_parser(filters_list, meets, current_user): or_query.add(AttendeeService.filter_parser(or_element, meets, current_user), Q.OR) return or_query elif filters_list[1] == '=': - return Q(**{filters_list[0].replace('.', '__'): filters_list[2]}) + return Q(**{AttendeeService.field_convert(filters_list[0], meets, current_user): filters_list[2]}) + elif filters_list[1] == 'startswith': + return Q(**{AttendeeService.field_convert(filters_list[0], meets, current_user) + '__istartswith': filters_list[2]}) + elif filters_list[1] == 'endswith': + return Q(**{AttendeeService.field_convert(filters_list[0], meets, current_user) + '__iendswith': filters_list[2]}) elif filters_list[1] == 'contains': return Q(**{AttendeeService.field_convert(filters_list[0], meets, current_user) + '__icontains': filters_list[2]}) + elif filters_list[1] == '<>': + return ~Q(**{AttendeeService.field_convert(filters_list[0], meets, current_user): filters_list[2]}) return Q() @staticmethod diff --git a/attendees/persons/urls.py b/attendees/persons/urls.py index 64934ed1..3b473b3a 100644 --- a/attendees/persons/urls.py +++ b/attendees/persons/urls.py @@ -17,7 +17,7 @@ api_datagrid_data_familyattendees_viewset, api_attendee_relationships_viewset, datagrid_assembly_all_attendings_list_view, - datagrid_assembly_data_attendees_list_view, + attendees_list_view, datagrid_assembly_data_attendings_list_view, attendee_update_view, api_attendee_attendings_viewset, @@ -126,9 +126,9 @@ ), path( - "datagrid_assembly_data_attendees/", - view=datagrid_assembly_data_attendees_list_view, - name="datagrid_assembly_data_attendees", + 'attendees/', + view=attendees_list_view, + name='attendees_list_view', ), path( diff --git a/attendees/persons/views/__init__.py b/attendees/persons/views/__init__.py index c7685b5b..31bff8b8 100644 --- a/attendees/persons/views/__init__.py +++ b/attendees/persons/views/__init__.py @@ -14,7 +14,7 @@ from .api.datagrid_data_familyattendees import api_datagrid_data_familyattendees_viewset from .api.assembly_meet_attendees import api_assembly_meet_attendees_viewset from .page.datagrid_assembly_all_attendings import datagrid_assembly_all_attendings_list_view -from .page.datagrid_assembly_data_attendees import datagrid_assembly_data_attendees_list_view +from .page.attendees_list_view import attendees_list_view from .page.datagrid_assembly_data_attendings import datagrid_assembly_data_attendings_list_view from .page.attendee_update_view import attendee_update_view from .api.user_meet_attendings import api_user_meet_attendings_viewset diff --git a/attendees/persons/views/page/datagrid_assembly_data_attendees.py b/attendees/persons/views/page/attendees_list_view.py similarity index 94% rename from attendees/persons/views/page/datagrid_assembly_data_attendees.py rename to attendees/persons/views/page/attendees_list_view.py index 3b2fbaa8..9cc68a76 100644 --- a/attendees/persons/views/page/datagrid_assembly_data_attendees.py +++ b/attendees/persons/views/page/attendees_list_view.py @@ -18,9 +18,9 @@ @method_decorator([login_required], name='dispatch') -class DatagridAssemblyDataAttendeesListView(RouteGuard, ListView): +class AttendeesListView(RouteGuard, ListView): queryset = [] - template_name = 'persons/datagrid_assembly_data_attendees.html' + template_name = 'persons/attendees_list_view.html' def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) @@ -64,4 +64,4 @@ def render_to_response(self, context, **kwargs): # view only provides empty tab # return '' -datagrid_assembly_data_attendees_list_view = DatagridAssemblyDataAttendeesListView.as_view() +attendees_list_view = AttendeesListView.as_view() diff --git a/attendees/static/js/persons/datagrid_assembly_data_attendees.js b/attendees/static/js/persons/attendees_list_view.js similarity index 98% rename from attendees/static/js/persons/datagrid_assembly_data_attendees.js rename to attendees/static/js/persons/attendees_list_view.js index af6d8edb..da331ad5 100644 --- a/attendees/static/js/persons/datagrid_assembly_data_attendees.js +++ b/attendees/static/js/persons/attendees_list_view.js @@ -1,7 +1,7 @@ Attendees.dataAttendees = { meetTagBox: null, init: () => { - console.log("attendees/static/js/persons/datagrid_assembly_data_attendees.js"); + console.log("attendees/static/js/persons/attendees_list_view.js"); Attendees.utilities.setAjaxLoaderOnDevExtreme(); Attendees.dataAttendees.startMeetSelector(); Attendees.dataAttendees.setDataAttrs(); diff --git a/attendees/templates/persons/datagrid_assembly_data_attendees.html b/attendees/templates/persons/attendees_list_view.html similarity index 96% rename from attendees/templates/persons/datagrid_assembly_data_attendees.html rename to attendees/templates/persons/attendees_list_view.html index 1bc7c053..47816df1 100644 --- a/attendees/templates/persons/datagrid_assembly_data_attendees.html +++ b/attendees/templates/persons/attendees_list_view.html @@ -27,7 +27,7 @@ {% endblock extra_head %} From d5ab1fe20db7f6a7a276e5d7d7f97f0dec335019 Mon Sep 17 00:00:00 2001 From: Jack Lin Date: Sat, 17 Jul 2021 11:50:49 -0700 Subject: [PATCH 7/8] updated url name in seeds data --- README.md | 2 +- fixtures/db_seed.json | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 7fdd937d..1b34221f 100644 --- a/README.md +++ b/README.md @@ -115,7 +115,7 @@ All libraries are included to facilitate offline development - [x] [PR#16](https://github.com/xjlin0/attendees30/pull/16) delete function for human error - [x] [PR#5](https://github.com/xjlin0/attendees30/pull/5) Modify Attendee save method to combine/convert names by OpenCC to support searches in different text encoding, and retire db level full_name. - [x] [PR#8](https://github.com/xjlin0/attendees30/pull/8) implement secret/private relation/past general -- [ ] Move attendee/attendees page out of data assembly -- some coworkers need to see all attendees of the organization, with a way to see only family members for general users +- [x] Move attendee/attendees page out of data assembly -- some coworkers need to see all attendees of the organization, with a way to see only family members for general users - [x] [PR#17](https://github.com/xjlin0/attendees30/pull/17) remove all previous attendee edit testing pages - [x] [PR#18](https://github.com/xjlin0/attendees30/pull/18) remove attendee list page dependency of path params and take search params from user for assembly slug - [x] [PR#19](https://github.com/xjlin0/attendees30/pull/19) rename and move attendees/attendee page, and show attendees based on auth groups diff --git a/fixtures/db_seed.json b/fixtures/db_seed.json index 61a89330..39a63e8d 100644 --- a/fixtures/db_seed.json +++ b/fixtures/db_seed.json @@ -1117,19 +1117,19 @@ "pk": 15, "fields": { "created": "2020-11-20T16:12:21.803Z", - "modified": "2021-07-12T16:18:03.890Z", + "modified": "2021-07-17T17:29:22.795Z", "is_removed": false, "organization": 1, "category": "main", "parent": 1, "html_type": "a", - "urn": "/persons/datagrid_assembly_data_attendees/", - "url_name": "datagrid_assembly_data_attendees", + "urn": "/persons/attendees/", + "url_name": "attendees_list_view", "display_name": "others info \u4ed6\u4eba\u8cc7\u6599", "display_order": 1000, "infos": { "class": "dropdown-item", - "title": "congregation attendee data" + "title": "other attendees data" }, "lft": 14, "rght": 15, @@ -9160,7 +9160,7 @@ "actual_birthday": null, "estimated_birthday": null, "deathday": null, - "photo": "attendee_portrait/Rembrandt_Harmensz._van_Rijn__Abraham_ZsVZoFY.jpg", + "photo": "", "progressions": {}, "infos": { "fixed": { From 62e24d816a9f8f048684dc058a5ed53a449136f4 Mon Sep 17 00:00:00 2001 From: Jack Lin Date: Sat, 17 Jul 2021 12:17:17 -0700 Subject: [PATCH 8/8] refactor self attendee update view url spyguard so no extra kwargs needed --- attendees/persons/urls.py | 1 - attendees/users/authorization/route_guard.py | 6 ++---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/attendees/persons/urls.py b/attendees/persons/urls.py index 3b473b3a..2ff0b21c 100644 --- a/attendees/persons/urls.py +++ b/attendees/persons/urls.py @@ -139,7 +139,6 @@ path( 'attendee/self', - kwargs={'myself': True}, view=attendee_update_view, name='attendee_update_self', # null attendee_id will be replaced by request.user's attendee_id ), diff --git a/attendees/users/authorization/route_guard.py b/attendees/users/authorization/route_guard.py index ea7dbe40..b5c7265b 100644 --- a/attendees/users/authorization/route_guard.py +++ b/attendees/users/authorization/route_guard.py @@ -27,19 +27,17 @@ def handle_no_permission(self): class SpyGuard(UserPassesTestMixin): def test_func(self): # Superusers can still access such attendee in admin UI - targeting_attendee_id = self.request.META.get('HTTP_X_TARGET_ATTENDEE_ID', self.kwargs.get('attendee_id')) + targeting_attendee_id = self.request.META.get('HTTP_X_TARGET_ATTENDEE_ID', self.kwargs.get('attendee_id', self.request.user.attendee_uuid_str())) current_attendee = self.request.user.attendee if targeting_attendee_id == 'new': - return Menu.user_can_create_attendee(self.request.user) # assume url is datagrid_attendee_create_view + return Menu.user_can_create_attendee(self.request.user) # create nonfamily attendee is attendee_create_view if targeting_attendee_id: if current_attendee: if str(current_attendee.id) == targeting_attendee_id: return True if current_attendee.under_same_org_with(targeting_attendee_id): return self.request.user.privileged() or current_attendee.can_schedule_attendee(targeting_attendee_id) - if targeting_attendee_id is None: - return self.kwargs.get('myself') time.sleep(2) return False