diff options
| -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'): | 
