refactor: move organisation latlng to answerset

This commit is contained in:
James Graham
2021-02-24 15:44:34 +00:00
parent c8a68d542a
commit 71e5352b6b
5 changed files with 121 additions and 16 deletions

View File

@@ -14,7 +14,9 @@ class OrganisationForm(forms.ModelForm):
"""Form for creating / updating an instance of :class:`Organisation`.""" """Form for creating / updating an instance of :class:`Organisation`."""
class Meta: class Meta:
model = models.Organisation model = models.Organisation
fields = ['name', 'latitude', 'longitude'] fields = [
'name'
]
class PersonForm(forms.ModelForm): class PersonForm(forms.ModelForm):
@@ -74,7 +76,14 @@ class OrganisationAnswerSetForm(forms.ModelForm, DynamicAnswerSetBase):
""" """
class Meta: class Meta:
model = models.OrganisationAnswerSet model = models.OrganisationAnswerSet
fields = [] fields = [
'latitude',
'longitude',
]
widgets = {
'latitude': forms.HiddenInput,
'longitude': forms.HiddenInput,
}
question_model = models.OrganisationQuestion question_model = models.OrganisationQuestion
answer_model = models.OrganisationQuestionChoice answer_model = models.OrganisationQuestionChoice

View File

@@ -0,0 +1,91 @@
# Generated by Django 2.2.10 on 2021-02-24 15:29
from django.core.exceptions import ObjectDoesNotExist
from django.db import migrations, models
def migrate_forward(apps, schema_editor):
Organisation = apps.get_model('people', 'Organisation')
fields = {
'latitude',
'longitude',
}
for obj in Organisation.objects.all():
try:
answer_set = obj.answer_sets.last()
if answer_set is None:
raise ObjectDoesNotExist
except ObjectDoesNotExist:
answer_set = obj.answer_sets.create()
for field in fields:
value = getattr(obj, field)
try:
setattr(answer_set, field, value)
except TypeError:
# Cannot directly set an m2m field
m2m = getattr(answer_set, field)
m2m.set(value.all())
answer_set.save()
def migrate_backward(apps, schema_editor):
Organisation = apps.get_model('people', 'Organisation')
fields = {
'latitude',
'longitude',
}
for obj in Organisation.objects.all():
try:
answer_set = obj.answer_sets.last()
for field in fields:
value = getattr(answer_set, field)
try:
setattr(obj, field, value)
except TypeError:
# Cannot directly set an m2m field
m2m = getattr(obj, field)
m2m.set(value.all())
obj.save()
except ObjectDoesNotExist:
pass
class Migration(migrations.Migration):
dependencies = [
('people', '0035_add_organisation_questions'),
]
operations = [
migrations.AddField(
model_name='organisationanswerset',
name='latitude',
field=models.FloatField(blank=True, null=True),
),
migrations.AddField(
model_name='organisationanswerset',
name='longitude',
field=models.FloatField(blank=True, null=True),
),
migrations.RunPython(migrate_forward, migrate_backward),
migrations.RemoveField(
model_name='organisation',
name='latitude',
),
migrations.RemoveField(
model_name='organisation',
name='longitude',
),
]

View File

@@ -93,12 +93,6 @@ class Organisation(models.Model):
"""Organisation to which a :class:`Person` belongs.""" """Organisation to which a :class:`Person` belongs."""
name = models.CharField(max_length=255, blank=False, null=False) name = models.CharField(max_length=255, blank=False, null=False)
#: Latitude for displaying location on a map
latitude = models.FloatField(blank=True, null=True)
#: Longitude for displaying location on a map
longitude = models.FloatField(blank=True, null=True)
def __str__(self) -> str: def __str__(self) -> str:
return self.name return self.name
@@ -119,6 +113,12 @@ class OrganisationAnswerSet(AnswerSet):
blank=False, blank=False,
null=False) null=False)
#: Latitude for displaying location on a map
latitude = models.FloatField(blank=True, null=True)
#: Longitude for displaying location on a map
longitude = models.FloatField(blank=True, null=True)
#: Answers to :class:`OrganisationQuestion`s #: Answers to :class:`OrganisationQuestion`s
question_answers = models.ManyToManyField(OrganisationQuestionChoice) question_answers = models.ManyToManyField(OrganisationQuestionChoice)
@@ -130,7 +130,7 @@ class OrganisationAnswerSet(AnswerSet):
"""Get the answers from this set as a dictionary for use in Form.initial.""" """Get the answers from this set as a dictionary for use in Form.initial."""
exclude_fields = { exclude_fields = {
'id', 'id',
'timestemp', 'timestamp',
'replaced_timestamp', 'replaced_timestamp',
'organisation_id', 'organisation_id',
'question_answers', 'question_answers',
@@ -298,7 +298,7 @@ class PersonAnswerSet(AnswerSet):
"""Get the answers from this set as a dictionary for use in Form.initial.""" """Get the answers from this set as a dictionary for use in Form.initial."""
exclude_fields = { exclude_fields = {
'id', 'id',
'timestemp', 'timestamp',
'replaced_timestamp', 'replaced_timestamp',
'person_id', 'person_id',
'question_answers', 'question_answers',

View File

@@ -33,7 +33,10 @@
{% csrf_token %} {% csrf_token %}
{% load bootstrap4 %} {% load bootstrap4 %}
{% bootstrap_form form %} {% bootstrap_form form exclude='latitude,longitude' %}
{% bootstrap_field form.latitude %}
{% bootstrap_field form.longitude %}
{% buttons %} {% buttons %}
<button class="btn btn-success" type="submit">Submit</button> <button class="btn btn-success" type="submit">Submit</button>

View File

@@ -31,11 +31,12 @@ class OrganisationDetailView(LoginRequiredMixin, DetailView):
"""Add map marker to context.""" """Add map marker to context."""
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
context['answer_set'] = self.object.current_answers answerset = self.object.current_answers
context['answer_set'] = answerset
context['map_markers'] = [{ context['map_markers'] = [{
'name': self.object.name, 'name': self.object.name,
'lat': self.object.latitude, 'lat': getattr(answerset, 'latitude', None),
'lng': self.object.longitude, 'lng': getattr(answerset, 'longitude', None),
}] }]
return context return context
@@ -53,10 +54,11 @@ class OrganisationUpdateView(LoginRequiredMixin, UpdateView):
"""Add map marker to context.""" """Add map marker to context."""
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
answerset = self.object.current_answers
context['map_markers'] = [{ context['map_markers'] = [{
'name': self.object.name, 'name': self.object.name,
'lat': self.object.latitude, 'lat': getattr(answerset, 'latitude', None),
'lng': self.object.longitude, 'lng': getattr(answerset, 'longitude', None),
}] }]
return context return context