diff options
| author | Étienne Loks <etienne.loks@proxience.com> | 2015-09-21 23:28:36 +0200 | 
|---|---|---|
| committer | Étienne Loks <etienne.loks@proxience.com> | 2015-09-21 23:28:36 +0200 | 
| commit | a23307e29cc5a4f0c6ad03aa300b0c07a680751b (patch) | |
| tree | 53df01f8bdeeab4aa94e081a381c2939962f0d66 | |
| parent | de51f7b9be16bbc260ea73cdaaef406976c5a8da (diff) | |
| download | Ishtar-a23307e29cc5a4f0c6ad03aa300b0c07a680751b.tar.bz2 Ishtar-a23307e29cc5a4f0c6ad03aa300b0c07a680751b.zip | |
Flake8
| -rw-r--r-- | archaeological_context_records/admin.py | 6 | ||||
| -rw-r--r-- | archaeological_context_records/data_importer.py | 36 | ||||
| -rw-r--r-- | archaeological_context_records/ishtar_menu.py | 78 | ||||
| -rw-r--r-- | archaeological_context_records/tests.py | 64 | ||||
| -rw-r--r-- | archaeological_context_records/urls.py | 72 | ||||
| -rw-r--r-- | archaeological_context_records/views.py | 48 | ||||
| -rw-r--r-- | archaeological_context_records/wizards.py | 22 | 
7 files changed, 171 insertions, 155 deletions
| diff --git a/archaeological_context_records/admin.py b/archaeological_context_records/admin.py index ca30b94d6..acbf61ead 100644 --- a/archaeological_context_records/admin.py +++ b/archaeological_context_records/admin.py @@ -17,13 +17,13 @@  # See the file COPYING for details. -from django.conf import settings  from django.contrib import admin  from ishtar_common.admin import HistorizedObjectAdmin, GeneralTypeAdmin  import models +  class DatingAdmin(admin.ModelAdmin):      list_display = ('period', 'start_date', 'end_date', 'dating_type',                      'quality') @@ -32,6 +32,7 @@ class DatingAdmin(admin.ModelAdmin):  admin.site.register(models.Dating, DatingAdmin) +  class ContextRecordAdmin(HistorizedObjectAdmin):      list_display = ('label', 'length', 'width',                      'thickness', 'depth') @@ -41,6 +42,7 @@ class ContextRecordAdmin(HistorizedObjectAdmin):  admin.site.register(models.ContextRecord, ContextRecordAdmin) +  class ContextRecordSourceAdmin(admin.ModelAdmin):      list_display = ('context_record', 'title', 'source_type',)      list_filter = ('source_type',) @@ -49,12 +51,14 @@ class ContextRecordSourceAdmin(admin.ModelAdmin):  admin.site.register(models.ContextRecordSource, ContextRecordSourceAdmin) +  class RecordRelationsAdmin(admin.ModelAdmin):      list_display = ('left_record', 'relation_type', 'right_record')      list_filter = ('relation_type',)  admin.site.register(models.RecordRelations, RecordRelationsAdmin) +  class RelationTypeAdmin(admin.ModelAdmin):      list_display = ('label', 'txt_idx', 'available', 'symmetrical',                      'inverse_relation') diff --git a/archaeological_context_records/data_importer.py b/archaeological_context_records/data_importer.py index 8c5df2ddf..ce2185f7a 100644 --- a/archaeological_context_records/data_importer.py +++ b/archaeological_context_records/data_importer.py @@ -17,35 +17,35 @@  # See the file COPYING for details. -import re - -from django.utils.translation import ugettext_lazy as _ -  from ishtar_common.data_importer import *  from archaeological_context_records import models +  class ContextRecordsImporterBibracte(Importer):      DESC = u"Exports Bibracte : importeur pour l'onglet UE"      OBJECT_CLS = models.ContextRecord -    DEFAULTS = { -               } +    DEFAULTS = {}      LINE_FORMAT = [          # ID operation          ImportFormater('operation__operation_code', IntegerFormater(), -                   duplicate_fields=['parcel__operation__operation_code'],), +                       duplicate_fields=['parcel__operation__operation_code']),          # ID UE -        ImportFormater('external_id', UnicodeFormater(120), duplicate_fields=['label'],), +        ImportFormater('external_id', UnicodeFormater(120), +                       duplicate_fields=['label'],),          # Type          ImportFormater('unit', TypeFormater(models.Unit), required=False),          # description          ImportFormater('description', UnicodeFormater(1000), required=False,),          # interprétation -        ImportFormater('interpretation', UnicodeFormater(1000), required=False,), -        # date ouverture -        ImportFormater('opening_date', DateFormater(['%Y/%m/%d']), required=False,), -        # date fermeture -        ImportFormater('closing_date', DateFormater(['%Y/%m/%d']), required=False,), +        ImportFormater('interpretation', UnicodeFormater(1000), +                       required=False,), +        # date ouverture +        ImportFormater('opening_date', DateFormater(['%Y/%m/%d']), +                       required=False,), +        # date fermeture +        ImportFormater('closing_date', DateFormater(['%Y/%m/%d']), +                       required=False,),          # lien vers parcelle          ImportFormater('parcel__external_id', UnicodeFormater(12),                         required=False,), @@ -58,18 +58,19 @@ class ContextRecordsImporterBibracte(Importer):          # chrono #TODO! pas de vrai création de nouvelle et en cas de modif          # c'est la zone          ImportFormater('datings__period', TypeFormater(models.Period), -                                                       required=False), +                       required=False),      ] +  class ContextRecordsRelationImporterBibracte(Importer):      DESC = u"Exports Bibracte : importeur pour l'onglet relations entre UE"      OBJECT_CLS = models.RecordRelations      DEFAULTS = {}      LINE_FORMAT = [          # code OA -        ImportFormater('left_record__operation__operation_code', -               IntegerFormater(), -               duplicate_fields=['right_record__operation__operation_code'],), +        ImportFormater( +            'left_record__operation__operation_code', IntegerFormater(), +            duplicate_fields=['right_record__operation__operation_code'],),          # identifiant UE 1          ImportFormater('left_record__external_id', UnicodeFormater(120),),          # type relation @@ -77,4 +78,3 @@ class ContextRecordsRelationImporterBibracte(Importer):          # identifiant UE 2          ImportFormater('right_record__external_id', UnicodeFormater(120),),      ] - diff --git a/archaeological_context_records/ishtar_menu.py b/archaeological_context_records/ishtar_menu.py index c471a75a8..49f92ad89 100644 --- a/archaeological_context_records/ishtar_menu.py +++ b/archaeological_context_records/ishtar_menu.py @@ -19,49 +19,49 @@  from django.utils.translation import ugettext_lazy as _ -from archaeological_operations.models import Operation  from ishtar_common.menu_base import SectionItem, MenuItem  import models  MENU_SECTIONS = [      (40, SectionItem('record_management', _(u"Context record"), -        childs=[ -            MenuItem('record_search', _(u"Search"), -                model=models.ContextRecord, -                access_controls=['view_contextrecord', -                                 'view_own_contextrecord']), -            MenuItem('record_creation', _(u"Creation"), -                model=models.ContextRecord, -                access_controls=['add_contextrecord', -                                 'add_own_contextrecord']), -            MenuItem('record_modification', _(u"Modification"), -                model=models.ContextRecord, -                access_controls=['change_contextrecord', -                                 'change_own_contextrecord']), -            MenuItem('record_deletion', _(u"Deletion"), -                model=models.ContextRecord, -                access_controls=['delete_contextrecord', -                                 'delete_own_contextrecord']), -            SectionItem('record_source', _(u"Documentation"), -                childs=[ -                    MenuItem('record_source_creation', -                             _(u"Add"), -                             model=models.ContextRecordSource, -                             access_controls=['change_contextrecord', -                                              'change_own_contextrecord']), -                    MenuItem('record_source_modification', -                             _(u"Modification"), -                             model=models.ContextRecordSource, -                             access_controls=['change_contextrecord', -                                              'change_own_contextrecord']), -                    MenuItem('record_source_deletion', -                             _(u"Deletion"), -                             model=models.ContextRecordSource, -                             access_controls=['change_contextrecord', -                                              'change_own_contextrecord']), -                ]) -        ]) -    ) +     childs=[MenuItem('record_search', _(u"Search"), +             model=models.ContextRecord, +             access_controls=['view_contextrecord', +                              'view_own_contextrecord']), +             MenuItem('record_creation', _(u"Creation"), +             model=models.ContextRecord, +             access_controls=['add_contextrecord', +                              'add_own_contextrecord']), +             MenuItem('record_modification', _(u"Modification"), +             model=models.ContextRecord, +             access_controls=['change_contextrecord', +                              'change_own_contextrecord']), +             MenuItem('record_deletion', _(u"Deletion"), +             model=models.ContextRecord, +             access_controls=['delete_contextrecord', +                              'delete_own_contextrecord']), +             SectionItem('record_source', _(u"Documentation"), +                         childs=[ +                         MenuItem('record_source_creation', +                                  _(u"Add"), +                                  model=models.ContextRecordSource, +                                  access_controls=[ +                                      'change_contextrecord', +                                      'change_own_contextrecord']), +                         MenuItem('record_source_modification', +                                  _(u"Modification"), +                                  model=models.ContextRecordSource, +                                  access_controls=[ +                                      'change_contextrecord', +                                      'change_own_contextrecord']), +                         MenuItem('record_source_deletion', +                                  _(u"Deletion"), +                                  model=models.ContextRecordSource, +                                  access_controls=[ +                                      'change_contextrecord', +                                      'change_own_contextrecord']), +                         ]) +             ]) +     )  ] - diff --git a/archaeological_context_records/tests.py b/archaeological_context_records/tests.py index 00854ad7c..bccd859aa 100644 --- a/archaeological_context_records/tests.py +++ b/archaeological_context_records/tests.py @@ -20,7 +20,6 @@  """  Unit tests  """ -import json  from django.conf import settings  from django.core.exceptions import ValidationError @@ -29,11 +28,11 @@ from django.test import TestCase  from ishtar_common.models import ImporterType  from archaeological_operations.tests import OperationInitTest, \ -                                            ImportOperationTest -from archaeological_operations.models import Parcel +    ImportOperationTest  from archaeological_context_records import models  from ishtar_common import forms_common +  class ImportContextRecordTest(ImportOperationTest):      test_operations = False      test_context_records = True @@ -50,13 +49,14 @@ class ImportContextRecordTest(ImportOperationTest):          old_nb = models.ContextRecord.objects.count()          MCC = ImporterType.objects.get(name=u"MCC - UE") -        mcc_file = open(settings.ROOT_PATH + \ -                    '../archaeological_context_records/tests/'\ -                    'MCC-context-records-example.csv', 'rb') +        mcc_file = open( +            settings.ROOT_PATH + +            '../archaeological_context_records/tests/' +            'MCC-context-records-example.csv', 'rb')          file_dict = {'imported_file': SimpleUploadedFile(mcc_file.name,                                                           mcc_file.read())} -        post_dict = {'importer_type':MCC.pk, 'skip_lines':1, -                     "encoding":'utf-8'} +        post_dict = {'importer_type': MCC.pk, 'skip_lines': 1, +                     "encoding": 'utf-8'}          form = forms_common.NewImportForm(data=post_dict, files=file_dict,                                            instance=None)          form.is_valid() @@ -91,7 +91,7 @@ class ContextRecordInit(OperationInitTest):          if not getattr(self, 'context_records', None):              self.context_records = [] -        default = {'label':"Context record"} +        default = {'label': "Context record"}          if not data.get('operation'):              data['operation'] = self.get_default_operation()          if not data.get('parcel'): @@ -101,12 +101,13 @@ class ContextRecordInit(OperationInitTest):          default.update(data)          self.context_records.append(models.ContextRecord.objects.create( -                                                               **default)) +            **default))          return self.context_records      def get_default_context_record(self):          return self.create_context_record()[0] +  class RecordRelationsTest(TestCase, ContextRecordInit):      fixtures = [settings.ROOT_PATH +                  '../fixtures/initial_data.json', @@ -120,22 +121,22 @@ class RecordRelationsTest(TestCase, ContextRecordInit):      def setUp(self):          # two different context records -        self.create_context_record({"label":u"CR 1"}) -        self.create_context_record({"label":u"CR 2"}) +        self.create_context_record({"label": u"CR 1"}) +        self.create_context_record({"label": u"CR 2"})      def testRelations(self): -        sym_rel_type = models.RelationType.objects.create(symmetrical=True, -                                                     txt_idx='sym') -        rel_type_1 = models.RelationType.objects.create(symmetrical=False, -                                                     txt_idx='rel_1') +        sym_rel_type = models.RelationType.objects.create( +            symmetrical=True, txt_idx='sym') +        rel_type_1 = models.RelationType.objects.create( +            symmetrical=False, txt_idx='rel_1')          # cannot be symmetrical and have an inverse_relation          with self.assertRaises(ValidationError): -            rel_test = models.RelationType.objects.create(symmetrical=True, -                               inverse_relation=rel_type_1, txt_idx='rel_3') +            rel_test = models.RelationType.objects.create( +                symmetrical=True, inverse_relation=rel_type_1, txt_idx='rel_3')              rel_test.full_clean()          # auto fill inverse relations -        rel_type_2 = models.RelationType.objects.create(symmetrical=False, -                             inverse_relation=rel_type_1, txt_idx='rel_2') +        rel_type_2 = models.RelationType.objects.create( +            symmetrical=False, inverse_relation=rel_type_1, txt_idx='rel_2')          self.assertEqual(rel_type_1.inverse_relation, rel_type_2)          cr_1 = self.context_records[0] @@ -143,19 +144,22 @@ class RecordRelationsTest(TestCase, ContextRecordInit):          # inserting a new symmetrical relation automatically creates the same          # relation for the second context record -        rel = models.RecordRelations.objects.create(left_record=cr_1, -                                right_record=cr_2, relation_type=sym_rel_type) -        self.assertEqual(models.RecordRelations.objects.filter(left_record=cr_2, -                      right_record=cr_1, relation_type=sym_rel_type).count(), 1) +        rel = models.RecordRelations.objects.create( +            left_record=cr_1, right_record=cr_2, relation_type=sym_rel_type) +        self.assertEqual(models.RecordRelations.objects.filter( +            left_record=cr_2, right_record=cr_1, +            relation_type=sym_rel_type).count(), 1)          # removing one symmetrical relation removes the other          rel.delete() -        self.assertEqual(models.RecordRelations.objects.filter(left_record=cr_2, -                      right_record=cr_1, relation_type=sym_rel_type).count(), 0) +        self.assertEqual(models.RecordRelations.objects.filter( +            left_record=cr_2, right_record=cr_1, +            relation_type=sym_rel_type).count(), 0)          # for non-symmetrical relation, adding one relation automatically          # adds the inverse -        rel = models.RecordRelations.objects.create(left_record=cr_1, -                                right_record=cr_2, relation_type=rel_type_1) -        self.assertEqual(models.RecordRelations.objects.filter(left_record=cr_2, -                      right_record=cr_1, relation_type=rel_type_2).count(), 1) +        rel = models.RecordRelations.objects.create( +            left_record=cr_1, right_record=cr_2, relation_type=rel_type_1) +        self.assertEqual(models.RecordRelations.objects.filter( +            left_record=cr_2, right_record=cr_1, +            relation_type=rel_type_2).count(), 1) diff --git a/archaeological_context_records/urls.py b/archaeological_context_records/urls.py index 7d288b031..7e7adb937 100644 --- a/archaeological_context_records/urls.py +++ b/archaeological_context_records/urls.py @@ -21,41 +21,43 @@ from django.conf.urls.defaults import *  import views  # forms -urlpatterns = patterns('', -       # Context records -       url(r'record_search/(?P<step>.+)?$', -           views.record_search_wizard, name='record_search'), -       url(r'record_creation/(?P<step>.+)?$', -           views.record_creation_wizard, name='record_creation'), -       url(r'record_modification/(?P<step>.+)?$', -           views.record_modification_wizard, name='record_modification'), -       url(r'record_modify/(?P<pk>.+)/$', -           views.record_modify, name='record_modify'), -       url(r'record_deletion/(?P<step>.+)?$', -           views.record_deletion_wizard, name='record_deletion'), -       url(r'record_source_creation/(?P<step>.+)?$', -           views.record_source_creation_wizard, -           name='record_source_creation'), -       url(r'record_source_modification/(?P<step>.+)?$', -           views.record_source_modification_wizard, -           name='record_source_modification'), -       url(r'record_source_deletion/(?P<step>.+)?$', -           views.record_source_deletion_wizard, -           name='record_source_deletion'), +urlpatterns = patterns( +    '', +    # Context records +    url(r'record_search/(?P<step>.+)?$', +        views.record_search_wizard, name='record_search'), +    url(r'record_creation/(?P<step>.+)?$', +        views.record_creation_wizard, name='record_creation'), +    url(r'record_modification/(?P<step>.+)?$', +        views.record_modification_wizard, name='record_modification'), +    url(r'record_modify/(?P<pk>.+)/$', +        views.record_modify, name='record_modify'), +    url(r'record_deletion/(?P<step>.+)?$', +        views.record_deletion_wizard, name='record_deletion'), +    url(r'record_source_creation/(?P<step>.+)?$', +        views.record_source_creation_wizard, +        name='record_source_creation'), +    url(r'record_source_modification/(?P<step>.+)?$', +        views.record_source_modification_wizard, +        name='record_source_modification'), +    url(r'record_source_deletion/(?P<step>.+)?$', +        views.record_source_deletion_wizard, +        name='record_source_deletion'),  ) -urlpatterns += patterns('archaeological_context_records.views', -     url(r'show-contextrecord(?:/(?P<pk>.+))?/(?P<type>.+)?$', -           'show_contextrecord', name='show-contextrecord'), -     url(r'show-historized-contextrecord/(?P<pk>.+)?/(?P<date>.+)?$', -           'show_contextrecord', name='show-historized-contextrecord'), -     url(r'revert-contextrecord/(?P<pk>.+)/(?P<date>.+)$', -           'revert_contextrecord', name='revert-contextrecord'), -     url(r'get-contextrecord/(?P<type>.+)?$', 'get_contextrecord', -           name='get-contextrecord'), -     url(r'get-contextrecord-full/(?P<type>.+)?$', -           'get_contextrecord', name='get-contextrecord-full', -           kwargs={'full':True}), -     url(r'get-contexrecordsource/(?P<type>.+)?$', -           'get_contextrecordsource', name='get-contextrecordsource'), +urlpatterns += patterns( +    'archaeological_context_records.views', +    url(r'show-contextrecord(?:/(?P<pk>.+))?/(?P<type>.+)?$', +        'show_contextrecord', name='show-contextrecord'), +    url(r'show-historized-contextrecord/(?P<pk>.+)?/(?P<date>.+)?$', +        'show_contextrecord', name='show-historized-contextrecord'), +    url(r'revert-contextrecord/(?P<pk>.+)/(?P<date>.+)$', +        'revert_contextrecord', name='revert-contextrecord'), +    url(r'get-contextrecord/(?P<type>.+)?$', 'get_contextrecord', +        name='get-contextrecord'), +    url(r'get-contextrecord-full/(?P<type>.+)?$', +        'get_contextrecord', name='get-contextrecord-full', +        kwargs={'full': True}), +    url(r'get-contexrecordsource/(?P<type>.+)?$', +        'get_contextrecordsource', name='get-contextrecordsource'),  ) diff --git a/archaeological_context_records/views.py b/archaeological_context_records/views.py index 526f5aca6..d92e162c3 100644 --- a/archaeological_context_records/views.py +++ b/archaeological_context_records/views.py @@ -30,24 +30,28 @@ import models  show_contextrecord = show_item(models.ContextRecord, 'contextrecord')  revert_contextrecord = revert_item(models.ContextRecord) -get_contextrecord = get_item(models.ContextRecord, -        'get_contextrecord', 'contextrecord', -      extra_request_keys={'parcel__town':'parcel__town__pk', -                  'operation__year':'operation__year__contains', -                  'operation__code_patriarche':'operation__code_patriarche', -                  'operation__operation_code':'operation__operation_code', -                  'datings__period':'datings__period__pk', -                  'parcel_0':'operation__parcels__section', -                  'parcel_1':'operation__parcels__parcel_number', -                  'label':'label__icontains' -                  },) -get_contextrecordsource = get_item(models.ContextRecordSource, -        'get_contextrecordsource', 'contextrecordsource', -      extra_request_keys={ -    'context_record__parcel__town':'context_record__parcel__town__pk', -    'context_record__operation__year':'context_record__operation__year', -    'context_record__datings__period':'context_record__datings__period__pk', -    'context_record__unit':'context_record__unit__pk', +get_contextrecord = get_item( +    models.ContextRecord, +    'get_contextrecord', 'contextrecord', +    extra_request_keys={ +        'parcel__town': 'parcel__town__pk', +        'operation__year': 'operation__year__contains', +        'operation__code_patriarche': 'operation__code_patriarche', +        'operation__operation_code': 'operation__operation_code', +        'datings__period': 'datings__period__pk', +        'parcel_0': 'operation__parcels__section', +        'parcel_1': 'operation__parcels__parcel_number', +        'label': 'label__icontains' +    },) +get_contextrecordsource = get_item( +    models.ContextRecordSource, +    'get_contextrecordsource', 'contextrecordsource', +    extra_request_keys={ +        'context_record__parcel__town': 'context_record__parcel__town__pk', +        'context_record__operation__year': 'context_record__operation__year', +        'context_record__datings__period': +            'context_record__datings__period__pk', +        'context_record__unit': 'context_record__unit__pk',      })  record_search_wizard = SearchWizard.as_view([ @@ -73,12 +77,13 @@ record_modification_wizard = RecordModifWizard.as_view([      label=_(u"Context record modification"),      url_name='record_modification',) +  def record_modify(request, pk): -    view = record_modification_wizard(request) +    record_modification_wizard(request)      RecordModifWizard.session_set_value( -                    request, 'selec-record_modification', 'pk', pk, reset=True) +        request, 'selec-record_modification', 'pk', pk, reset=True)      return redirect(reverse('record_modification', -                            kwargs={'step':'general-record_modification'})) +                    kwargs={'step': 'general-record_modification'}))  record_deletion_wizard = RecordDeletionWizard.as_view([      ('selec-record_deletion', RecordFormSelection), @@ -107,4 +112,3 @@ record_source_deletion_wizard = RecordSourceDeletionWizard.as_view([      ('final-record_source_deletion', RecordDeletionForm)],      label=_(u"Context record: source deletion"),      url_name='record_source_deletion',) - diff --git a/archaeological_context_records/wizards.py b/archaeological_context_records/wizards.py index cd48d1308..a51809d32 100644 --- a/archaeological_context_records/wizards.py +++ b/archaeological_context_records/wizards.py @@ -17,16 +17,14 @@  # See the file COPYING for details. -from django.conf import settings  from django.core.exceptions import ObjectDoesNotExist -from django.shortcuts import render_to_response -from django.template import RequestContext  from django.utils.translation import ugettext_lazy as _  from ishtar_common.forms import reverse_lazy  from ishtar_common.wizards import Wizard, DeletionWizard, SourceWizard  import models +  class RecordWizard(Wizard):      model = models.ContextRecord      edit = False @@ -37,10 +35,11 @@ class RecordWizard(Wizard):          if not step:              return          # manage manualy on creation -        if step.endswith('_creation'): # an operation has been selected +        if step.endswith('_creation'):  # an operation has been selected              main_form_key = 'selec-' + self.url_name              try: -                idx = int(self.session_get_value(main_form_key, 'operation_id')) +                idx = int(self.session_get_value( +                    main_form_key, 'operation_id'))                  current_ope = models.Operation.objects.get(pk=idx)                  return current_ope              except(TypeError, ValueError, ObjectDoesNotExist): @@ -71,12 +70,12 @@ class RecordWizard(Wizard):              data = {}          if not step:              step = self.steps.current -            #step = self.determine_step(request, storage) +            # step = self.determine_step(request, storage)          form = self.get_form_list()[step] -        general_form_key = 'general-' + self.url_name +        # general_form_key = 'general-' + self.url_name          if step.startswith('general-'): -            if step.endswith('_creation'): # an operation has been selected +            if step.endswith('_creation'):  # an operation has been selected                  main_form_key = 'selec-' + self.url_name                  try:                      idx = int(self.session_get_value(main_form_key, @@ -91,10 +90,12 @@ class RecordWizard(Wizard):          form = super(RecordWizard, self).get_form(step, data, files)          return form +  class RecordModifWizard(RecordWizard):      modification = True      model = models.ContextRecord +  class RecordDeletionWizard(DeletionWizard):      model = models.ContextRecord      fields = ['label', 'parcel', 'description', 'length', 'width', 'thickness', @@ -102,10 +103,11 @@ class RecordDeletionWizard(DeletionWizard):                'filling', 'interpretation', 'taq', 'taq_estimated', 'tpq',                'tpq_estimated'] +  class RecordSourceWizard(SourceWizard):      model = models.ContextRecordSource +  class RecordSourceDeletionWizard(DeletionWizard):      model = models.ContextRecordSource -    fields = ['context_record', 'title', 'source_type', 'authors',] - +    fields = ['context_record', 'title', 'source_type', 'authors', ] | 
