diff --git a/src/api/views/maps.py b/src/api/views/maps.py index 6b90e250eed73460783ffa3f4f4392591744713c..2a7d70b3409c82edea057e8c00d08a109662a5ab 100644 --- a/src/api/views/maps.py +++ b/src/api/views/maps.py @@ -142,6 +142,7 @@ class C3NavExportView(ConferenceSlugMixin, APIView): if request.GET.get('all') != '1': qs = qs.exclude(location_point=None, location_boundaries=None) for assembly in qs: # type: Assembly + loc_data = assembly.location_data or {} data.append( { 'type': 'assembly', @@ -154,8 +155,8 @@ class C3NavExportView(ConferenceSlugMixin, APIView): 'parent_id': assembly.parent_id, 'children': assembly.children.filter(state_assembly__in=exportable_states).values_list('slug', flat=True) if assembly.is_cluster else None, 'floor': assembly.get_location_floor_index(), - 'location': assembly.get_location_point_xy(), - 'polygons': assembly.get_location_boundaries_xy(), + 'location': loc_data.get('point'), # assembly.get_location_point_xy(), + 'polygons': loc_data.get('boundaries'), # assembly.get_location_boundaries_xy(), } ) diff --git a/src/backoffice/templates/backoffice/assemblyteam_editposition.html b/src/backoffice/templates/backoffice/assemblyteam_editposition.html index c95ee424733bbc90cedfb5c1eb8895813b57f7df..af394b8dcd564f28d2f47d12e1e61db4d94fcd3f 100644 --- a/src/backoffice/templates/backoffice/assemblyteam_editposition.html +++ b/src/backoffice/templates/backoffice/assemblyteam_editposition.html @@ -37,13 +37,13 @@ <div class="row mb-3"> <label class="col-sm-2 col-form-label text-muted" for="poi">{% trans "Assembly__location_point" %}</label> <div class="col-sm-10"> - <input class="form-control" readonly type="text" name="location_point" id="poi" value="{{ assembly.get_location_point_as_json }}"> + <input class="form-control" readonly type="text" name="location_point" id="poi" value="{{ map_location|default:"" }}"> </div> </div> <div class="row mb-3"> <label class="col-sm-2 col-form-label text-muted" for="areas">{% trans "Assembly__location_boundaries" %}</label> <div class="col-sm-10"> - <input class="form-control" readonly type="text" name="location_boundaries" id="areas" value="{{ assembly.get_location_boundaries_as_json }}"> + <input class="form-control" readonly type="text" name="location_boundaries" id="areas" value="{{ map_boundaries|default:"" }}"> </div> </div> </div> diff --git a/src/backoffice/views/assemblyteam.py b/src/backoffice/views/assemblyteam.py index e2be566020dd417fae7f8b080939e096cab44fe6..3f583a72d723865fa5242125d51e8b1db8bfc46f 100644 --- a/src/backoffice/views/assemblyteam.py +++ b/src/backoffice/views/assemblyteam.py @@ -6,7 +6,6 @@ from io import BytesIO from pandas import DataFrame, ExcelWriter from django.contrib import messages -from django.contrib.gis.geos import MultiPolygon, Point, Polygon from django.contrib.postgres.aggregates import StringAgg from django.db.models import OuterRef, Q, Subquery from django.http import Http404, HttpResponse @@ -555,6 +554,8 @@ class AssemblyEditHierarchyView(SingleAssemblyTeamMixin, View): class AssemblyEditPlacementView(SingleAssemblyTeamMixin, View): + SRID = 0 + def post(self, *args, **kwargs): request = self.request assembly = self.assembly @@ -574,24 +575,30 @@ class AssemblyEditPlacementView(SingleAssemblyTeamMixin, View): } changes = {} try: + assembly.location_data = assembly.location_data or {} + if poi and poi != '""': parsed = json.loads(poi) assert isinstance(parsed, list) and len(parsed) == 2 - assembly.location_point = Point(parsed[0], parsed[1]) + # assembly.location_point = Point(x=parsed[0], y=parsed[1], srid=self.SRID) + assembly.location_data['point'] = parsed changes['location_point'] = str(assembly.location_point) else: - assembly.location_point = None + # assembly.location_point = None + assembly.location_data['point'] = None changes['location_point'] = str(None) if boundaries and boundaries != '""': parsed = json.loads(boundaries) assert isinstance(parsed, list) - assembly.location_boundaries = MultiPolygon([Polygon(item) for item in parsed]) + # assembly.location_boundaries = MultiPolygon([Polygon(item) for item in parsed], srid=self.SRID) + assembly.location_data['boundaries'] = parsed changes['location_boundaries'] = str(assembly.location_boundaries) else: - assembly.location_boundaries = None + # assembly.location_boundaries = None + assembly.location_data['boundaries'] = None changes['location_boundaries'] = str(None) if floor and floor != '""': @@ -604,6 +611,7 @@ class AssemblyEditPlacementView(SingleAssemblyTeamMixin, View): changes['location_floor'] = str(None) except ValueError: + logger.exception('Failed to update position of assembly %s', assembly.pk) messages.error(request, gettext('assemblyedit_position_error')) return redirect('backoffice:assemblyteam-editposition', pk=assembly.pk) @@ -625,7 +633,7 @@ class AssemblyEditPlacementView(SingleAssemblyTeamMixin, View): elif action != 'save': messages.warning(request, gettext('assemblyedit_position_unknownaction')) - assembly.save(update_fields=['state_assembly', 'location_point', 'location_boundaries', 'location_floor']) + assembly.save(update_fields=['state_assembly', 'location_point', 'location_boundaries', 'location_floor', 'location_data']) # log the action messages.success(request, gettext('assemblyedit_changedposition')) @@ -672,6 +680,9 @@ class AssemblyEditPlacementView(SingleAssemblyTeamMixin, View): def get(self, *args, **kwargs): context = self.get_context_data() context['uses_map'] = True + loc_data = context['assembly'].location_data or {} + context['map_location'] = loc_data.get('point') # context['assembly'].get_location_point_as_json() + context['map_boundaries'] = loc_data.get('boundaries') # context['assembly'].get_location_boundaries_as_json() return render(self.request, 'backoffice/assemblyteam_editposition.html', context) diff --git a/src/core/migrations/0142_assembly_location_data.py b/src/core/migrations/0142_assembly_location_data.py new file mode 100644 index 0000000000000000000000000000000000000000..7e2e23afd6529a233bdddc04e23e33c6e0290639 --- /dev/null +++ b/src/core/migrations/0142_assembly_location_data.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.6 on 2023-12-25 00:44 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0141_event_recording_event_streaming_room_recording_state_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='assembly', + name='location_data', + field=models.JSONField(blank=True, null=True), + ), + ] diff --git a/src/core/models/assemblies.py b/src/core/models/assemblies.py index a7bc9e058502ca2e1af304cc6555fd4ca76510d9..15d162e04548ac53e9f34c10050d4ff316476b8a 100644 --- a/src/core/models/assemblies.py +++ b/src/core/models/assemblies.py @@ -251,6 +251,12 @@ class Assembly(TaggedItemMixin, models.Model): verbose_name=_('Assembly__location_boundaries'), ) + location_data = models.JSONField( + blank=True, + null=True, + ) + """temporary work-around field for c3nav x/y coordinate scheme""" + created = models.DateTimeField( auto_now_add=True, help_text=_('Assembly__created__help'),