diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2020-03-06 11:41:54 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2020-03-06 11:44:44 +0100 |
commit | 73680a9956ce9b5a81b12296a19c4c782cbb1573 (patch) | |
tree | 87dc15b6b07b78eb8aed52a707c9adab5ae89a9f /archaeological_context_records | |
parent | fa494aa77940791e2a69589ed29ecc6fc680d680 (diff) | |
download | Ishtar-73680a9956ce9b5a81b12296a19c4c782cbb1573.tar.bz2 Ishtar-73680a9956ce9b5a81b12296a19c4c782cbb1573.zip |
Sheet actions: add duplicate for site, operation, document and context record
Diffstat (limited to 'archaeological_context_records')
6 files changed, 174 insertions, 32 deletions
diff --git a/archaeological_context_records/forms.py b/archaeological_context_records/forms.py index 2061ecc1f..87cad2c66 100644 --- a/archaeological_context_records/forms.py +++ b/archaeological_context_records/forms.py @@ -147,6 +147,27 @@ class RecordFormMultiSelection(LockForm, MultiSearchForm): validators=[valid_ids(models.ContextRecord)]) +def get_init_parcel(form, operation, prefix=""): + parcels = operation.parcels.all() + sort = lambda x: (x.town.name, x.section) + parcels = sorted(parcels, key=sort) + for key, gparcels in groupby(parcels, sort): + form.fields[prefix + 'parcel'].choices.append( + (" - ".join([k for k in key if k]), + [(parcel.pk, parcel.short_label) for parcel in gparcels]) + ) + if len(form.fields[prefix + 'parcel'].choices) == 1 and \ + (prefix + 'town') in form.fields: + # only the empty choice is available + form.fields.pop(prefix + 'parcel') + form.fields[prefix + 'town'].required = True + if (prefix + 'town') in form.fields: + if form.fields[prefix + 'town'].required: + form.fields[prefix + 'town'].choices = [] # remove the empty choice + form.fields[prefix + 'town'].choices += [ + (t.pk, str(t)) for t in operation.towns.all()] + + class RecordFormGeneral(CustomForm, ManageOldType): HEADERS = {} form_label = _("General") @@ -279,25 +300,7 @@ class RecordFormGeneral(CustomForm, ManageOldType): if operation: self.fields['operation_id'].initial = operation.pk - parcels = operation.parcels.all() - sort = lambda x: (x.town.name, x.section) - parcels = sorted(parcels, key=sort) - for key, gparcels in groupby(parcels, sort): - self.fields['parcel'].choices.append( - (" - ".join([k for k in key if k]), - [(parcel.pk, parcel.short_label) for parcel in gparcels]) - ) - if len(self.fields['parcel'].choices) == 1 and \ - 'town' in self.fields: - # only the empty choice is available - self.fields.pop('parcel') - self.fields['town'].required = True - if 'town' in self.fields: - if self.fields['town'].required: - self.fields['town'].choices = [] # remove the empty choice - self.fields['town'].choices += [(t.pk, str(t)) - for t in operation.towns.all()] - + get_init_parcel(self, operation) self.fields['archaeological_site'].choices += [ (site.pk, str(site)) for site in operation.archaeological_sites.all() @@ -478,3 +481,67 @@ class QAOperationCR(IshtarForm): else: data["town_id"] = self.cleaned_data['town'] models.ContextRecord.objects.create(**data) + + +class QAContextRecordDuplicateForm(IshtarForm): + qa_label = forms.CharField(label=_("ID"), max_length=None, required=True) + qa_parcel = forms.ChoiceField(label=_(u"Parcel"), choices=[]) + qa_town = forms.ChoiceField(label=_(u"Town"), choices=[], required=False) + qa_unit = forms.ChoiceField(label=_(u"Context record type"), required=False, + choices=[]) + + TYPES = [ + FieldType('qa_unit', models.Unit), + ] + + def __init__(self, *args, **kwargs): + self.user = None + if 'user' in kwargs: + self.user = kwargs.pop('user') + if hasattr(self.user, 'ishtaruser'): + self.user = self.user.ishtaruser + self.context_record = kwargs.pop('items')[0] + super(QAContextRecordDuplicateForm, self).__init__(*args, **kwargs) + + profile = IshtarSiteProfile.get_current_profile() + self.fields['qa_parcel'].choices = [('', '--')] + if not profile.parcel_mandatory: + self.fields['qa_parcel'].required = False + self.fields['qa_town'].choices = [('', '--')] + else: + self.fields.pop('qa_town') + + get_init_parcel(self, self.context_record.operation, prefix="qa_") + + if "qa_town" in self.fields and self.context_record.town: + self.fields["qa_town"].initial = self.context_record.town.pk + if "qa_parcel" in self.fields and self.context_record.parcel: + self.fields["qa_parcel"].initial = self.context_record.parcel.pk + + self.fields['qa_label'].initial = ( + self.context_record.label or "") + str(_(" - duplicate")) + if self.context_record.unit: + self.fields["qa_unit"].initial = self.context_record.unit.pk + + def save(self): + data = {"label": self.cleaned_data["qa_label"]} + if self.cleaned_data.get("qa_unit", None): + try: + data["unit"] = models.Unit.objects.get(pk=int( + self.cleaned_data["qa_unit"]), available=True) + except models.Unit.DoesNotExist: + pass + if self.cleaned_data.get("qa_town", None): + try: + data["town"] = Town.objects.get(pk=int( + self.cleaned_data["qa_town"])) + except Town.DoesNotExist: + pass + if self.cleaned_data.get("qa_parcel", None): + try: + data["parcel"] = Parcel.objects.get(pk=int( + self.cleaned_data["qa_parcel"])) + except Parcel.DoesNotExist: + pass + return self.context_record.duplicate( + self.user, data=data) diff --git a/archaeological_context_records/models.py b/archaeological_context_records/models.py index febc7cfdd..9b1483e0d 100644 --- a/archaeological_context_records/models.py +++ b/archaeological_context_records/models.py @@ -459,7 +459,11 @@ class ContextRecord(BulkUpdatedItem, DocumentItem, BaseHistorizedItem, rights=['change_contextrecord', 'change_own_contextrecord'] ) QUICK_ACTIONS = [ - QA_LOCK + QA_LOCK, + QuickAction( + url="contextrecord-qa-duplicate", icon_class="fa fa-clone", + text=_(u"Duplicate"), target="one", + rights=['change_contextrecord', 'change_own_contextrecord']), ] history = HistoricalRecords(bases=[HistoryModel]) @@ -723,6 +727,19 @@ class ContextRecord(BulkUpdatedItem, DocumentItem, BaseHistorizedItem, def show_url(self): return reverse('show-contextrecord', args=[self.pk, '']) + def get_extra_actions(self, request): + # url, base_text, icon, extra_text, extra css class, is a quick action + actions = super(ContextRecord, self).get_extra_actions(request) + + #is_locked = hasattr(self, "is_locked") and self.is_locked(request.user) + can_edit_cr = self.can_do(request, 'change_contextrecord') + if can_edit_cr: + actions += [ + (reverse("contextrecord-qa-duplicate", args=[self.pk]), + _("Duplicate"), "fa fa-clone", "", "", True), + ] + return actions + @classmethod def get_query_owns(cls, ishtaruser): q = cls._construct_query_own( diff --git a/archaeological_context_records/templates/ishtar/forms/qa_contextrecord_duplicate.html b/archaeological_context_records/templates/ishtar/forms/qa_contextrecord_duplicate.html new file mode 100644 index 000000000..a018a67fa --- /dev/null +++ b/archaeological_context_records/templates/ishtar/forms/qa_contextrecord_duplicate.html @@ -0,0 +1,39 @@ +{% extends "ishtar/forms/qa_base.html" %} +{% load i18n inline_formset table_form %} + +{% block main_form %} +{% if form.non_field_errors %} +<div class="alert alert-danger" role="alert"> + {{form.non_field_errors}} +</div> +{% endif %} +<div class="form-row"> + <div class="form-group col-lg-12 required full-width"> + <label>{% trans "Operation" %}{% trans ":" %}</label> + {{operation}} + </div> +</div> +{% with force_large_col=True %} +<div class="form-row"> + {% with form.qa_label as field %} + {% include "blocks/bs_field_snippet.html" %} + {% endwith %} +</div> +<div class="form-row"> + {% with form.qa_parcel as field %} + {% include "blocks/bs_field_snippet.html" %} + {% endwith %} +</div> +{% if form.qa_town %}<div class="form-row"> + {% with form.qa_town as field %} + {% include "blocks/bs_field_snippet.html" %} + {% endwith %} +</div>{% endif %} +{% if form.qa_parcel %}<div class="form-row"> + {% with form.qa_unit as field %} + {% include "blocks/bs_field_snippet.html" %} + {% endwith %} +</div>{% endif %} +{% endwith %} +{% endblock %} + diff --git a/archaeological_context_records/templates/ishtar/sheet_contextrecord.html b/archaeological_context_records/templates/ishtar/sheet_contextrecord.html index a7d01c6dd..ffeba676c 100644 --- a/archaeological_context_records/templates/ishtar/sheet_contextrecord.html +++ b/archaeological_context_records/templates/ishtar/sheet_contextrecord.html @@ -104,7 +104,6 @@ <div class="tab-pane fade show active" id="{{window_id}}-identification" role="tabpanel" aria-labelledby="{{window_id}}-identification-tab"> - {% if has_image %} <div class="clearfix"> <div class="card float-left col-12 col-md-6 col-lg-4"> {% include "ishtar/blocks/window_image.html" %} @@ -116,17 +115,10 @@ </p> </div> </div> - </div> - {% else %} - <div> - <p class='window-refs'>{{ item.parcel.short_label }}</p> - <p class="window-refs">{{ item.label|default:"" }}</p> - {% include "ishtar/blocks/sheet_external_id.html" %} - </div> - {% endif %} - <div class='row'> - {% field_flex_2 "Complete ID" item.full_label %} - {% field_flex_2 "Type" item.unit %} + <div class='row'> + {% field_flex_2 "Complete ID" item.full_label %} + {% field_flex_2 "Type" item.unit %} + </div> </div> <h3>{% trans "Description"%}</h3> <div class="row"> diff --git a/archaeological_context_records/urls.py b/archaeological_context_records/urls.py index d5c2c7d7d..434aa79f9 100644 --- a/archaeological_context_records/urls.py +++ b/archaeological_context_records/urls.py @@ -95,5 +95,9 @@ urlpatterns = [ url(r'^contextrecord-qa-lock/(?P<pks>[0-9-]+)?/$', views.QAContextRecordLockView.as_view(), name='contextrecord-qa-lock', kwargs={"model": models.ContextRecord}), + url(r'^contextrecord-qa-duplicate/(?P<pks>[0-9-]+)?/$', + check_rights(['change_contextrecord', 'change_own_contextrecord'])( + views.QAContextRecordDuplicateFormView.as_view()), + name='contextrecord-qa-duplicate'), ] diff --git a/archaeological_context_records/views.py b/archaeological_context_records/views.py index 74def46a4..215dd2b4a 100644 --- a/archaeological_context_records/views.py +++ b/archaeological_context_records/views.py @@ -233,3 +233,26 @@ class QAContextRecordLockView(QABaseLockView): model = models.ContextRecord base_url = "contextrecord-qa-lock" + +class QAContextRecordDuplicateFormView(QAItemForm): + template_name = 'ishtar/forms/qa_contextrecord_duplicate.html' + model = models.ContextRecord + page_name = _("Duplicate") + form_class = forms.QAContextRecordDuplicateForm + base_url = "contextrecord-qa-duplicate" + + def get_form_kwargs(self): + kwargs = super(QAContextRecordDuplicateFormView, self).get_form_kwargs() + kwargs['user'] = self.request.user + return kwargs + + def form_valid(self, form): + form.save() + return HttpResponseRedirect(reverse("success")) + + def get_context_data(self, **kwargs): + data = super(QAContextRecordDuplicateFormView, self).get_context_data( + **kwargs) + data['action_name'] = _(u"Duplicate") + data["operation"] = self.items[0].operation + return data |