diff options
author | Étienne Loks <etienne.loks@proxience.com> | 2015-12-21 15:06:21 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@proxience.com> | 2015-12-21 15:06:21 +0100 |
commit | b10f1833c7b8586706a1c9d7be9e8a37cd221ef3 (patch) | |
tree | 74b77b26a995380a6e828b6c8712aa0e5f2c00ea | |
parent | d7bef92eb2320243e3db1c0e03aeac42781e5585 (diff) | |
download | Ishtar-b10f1833c7b8586706a1c9d7be9e8a37cd221ef3.tar.bz2 Ishtar-b10f1833c7b8586706a1c9d7be9e8a37cd221ef3.zip |
Manage context record relations.
-rw-r--r-- | archaeological_context_records/forms.py | 34 | ||||
-rw-r--r-- | archaeological_context_records/models.py | 1 | ||||
-rw-r--r-- | archaeological_context_records/views.py | 4 | ||||
-rw-r--r-- | archaeological_context_records/wizards.py | 20 | ||||
-rw-r--r-- | archaeological_operations/forms.py | 10 |
5 files changed, 62 insertions, 7 deletions
diff --git a/archaeological_context_records/forms.py b/archaeological_context_records/forms.py index df5a83539..59f683620 100644 --- a/archaeological_context_records/forms.py +++ b/archaeological_context_records/forms.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -# Copyright (C) 2010-2013 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> +# Copyright (C) 2010-2015 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -36,7 +36,8 @@ from ishtar_common import widgets from ishtar_common.forms import FinalForm, FormSet, \ reverse_lazy, get_form_selection, TableSelect from ishtar_common.forms_common import get_town_field, SourceSelect -from archaeological_operations.forms import OperationSelect, ParcelField +from archaeological_operations.forms import OperationSelect, ParcelField,\ + RecordRelationsForm as OpeRecordRelationsForm class RecordSelect(TableSelect): @@ -181,6 +182,35 @@ DatingFormSet = formset_factory(DatingForm, can_delete=True, DatingFormSet.form_label = _("Dating") +class RecordRelationsForm(OpeRecordRelationsForm): + current_model = models.RelationType + current_related_model = models.ContextRecord + associated_models = {'right_record': models.ContextRecord, + 'relation_type': models.RelationType} + right_record = forms.ChoiceField( + label=_(u"Context record"), choices=[], required=False) + + def __init__(self, *args, **kwargs): + crs = None + if 'data' in kwargs and 'CONTEXT_RECORDS' in kwargs['data']: + crs = kwargs['data']['CONTEXT_RECORDS'] + # clean data if not "real" data + prefix_value = kwargs['prefix'] + '-right_record' + if not [k for k in kwargs['data'].keys() + if k.startswith(prefix_value) and kwargs['data'][k]]: + kwargs['data'] = None + if 'files' in kwargs: + kwargs.pop('files') + super(RecordRelationsForm, self).__init__(*args, **kwargs) + self.fields['relation_type'].choices = \ + models.RelationType.get_types() + if crs: + self.fields['right_record'].choices = [('', '-' * 2)] + crs + +RecordRelationsFormSet = formset_factory(RecordRelationsForm, can_delete=True) +RecordRelationsFormSet.form_label = _(u"Relations") + + class RecordFormInterpretation(forms.Form): form_label = _("Interpretation") associated_models = {'activity': models.ActivityType, diff --git a/archaeological_context_records/models.py b/archaeological_context_records/models.py index 85f7582f3..6fc950f52 100644 --- a/archaeological_context_records/models.py +++ b/archaeological_context_records/models.py @@ -296,6 +296,7 @@ class RelationType(GeneralRelationType): class RecordRelations(GeneralRecordRelations, models.Model): + MAIN_ATTR = 'left_record' left_record = models.ForeignKey(ContextRecord, related_name='right_relations') right_record = models.ForeignKey(ContextRecord, diff --git a/archaeological_context_records/views.py b/archaeological_context_records/views.py index cbf34ee07..41d290a3f 100644 --- a/archaeological_context_records/views.py +++ b/archaeological_context_records/views.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -# Copyright (C) 2010-2013 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> +# Copyright (C) 2010-2015 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -73,6 +73,7 @@ record_creation_wizard = RecordWizard.as_view([ ('general-record_creation', RecordFormGeneral), ('datings-record_creation', DatingFormSet), ('interpretation-record_creation', RecordFormInterpretation), + ('relations-record_creation', RecordRelationsFormSet), ('final-record_creation', FinalForm)], label=_(u"New context record"), url_name='record_creation',) @@ -82,6 +83,7 @@ record_modification_wizard = RecordModifWizard.as_view([ ('general-record_modification', RecordFormGeneral), ('datings-record_modification', DatingFormSet), ('interpretation-record_modification', RecordFormInterpretation), + ('relations-record_creation', RecordRelationsFormSet), ('final-record_modification', FinalForm)], label=_(u"Context record modification"), url_name='record_modification',) diff --git a/archaeological_context_records/wizards.py b/archaeological_context_records/wizards.py index 99c666e89..2449b400e 100644 --- a/archaeological_context_records/wizards.py +++ b/archaeological_context_records/wizards.py @@ -29,6 +29,14 @@ class RecordWizard(Wizard): model = models.ContextRecord edit = False wizard_done_window = reverse_lazy('show-contextrecord') + relations_step_key = 'relations' + + def get_template_names(self): + templates = super(RecordWizard, self).get_template_names() + current_step = self.steps.current + if current_step.startswith(self.relations_step_key): + templates = ['ishtar/wizard/relations_wizard.html'] + templates + return templates def get_current_operation(self): step = self.steps.current @@ -87,9 +95,21 @@ class RecordWizard(Wizard): else: current_object = self.get_current_object() data['context_record'] = current_object + elif step.startswith('relations') and hasattr(form, 'management_form'): + data['CONTEXT_RECORDS'] = self.get_other_context_records() form = super(RecordWizard, self).get_form(step, data, files) return form + def get_other_context_records(self): + operation = self.get_current_operation() + if not operation: + return [] + q = models.ContextRecord.objects.filter(operation=operation) + obj = self.get_current_object() + if obj and obj.pk: + q = q.exclude(pk=obj.pk) + return [(cr.pk, unicode(cr)) for cr in q.all()] + class RecordModifWizard(RecordWizard): modification = True diff --git a/archaeological_operations/forms.py b/archaeological_operations/forms.py index 1dad60ea1..cba230338 100644 --- a/archaeological_operations/forms.py +++ b/archaeological_operations/forms.py @@ -338,6 +338,8 @@ ParcelFormSet.form_label = _(u"Parcels") class RecordRelationsForm(forms.Form): base_model = 'right_relation' + current_model = models.RelationType + current_related_model = models.Operation associated_models = {'right_record': models.Operation, 'relation_type': models.RelationType} relation_type = forms.ChoiceField(label=_(u"Relation type"), @@ -373,14 +375,14 @@ class RecordRelationsForm(forms.Form): if not data: continue try: - relation_type = models.RelationType.objects.get( + relation_type = cls.current_model.objects.get( pk=data.get('relation_type')) - except models.RelationType.DoesNotExist: + except cls.current_model.DoesNotExist: continue try: - right_record = models.Operation.objects.get( + right_record = cls.current_related_model.objects.get( pk=data.get('right_record')) - except models.Operation.DoesNotExist: + except cls.current_related_model.DoesNotExist: continue values = [unicode(relation_type), right_record.reference] if data.get('DELETE'): |