summaryrefslogtreecommitdiff
path: root/archaeological_context_records
diff options
context:
space:
mode:
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
commit3808df22596ff03e8b24c9b97506f68c86197c60 (patch)
tree87dc15b6b07b78eb8aed52a707c9adab5ae89a9f /archaeological_context_records
parent2ebb25f9a93d9b840162ca035c243354a3169a87 (diff)
downloadIshtar-3808df22596ff03e8b24c9b97506f68c86197c60.tar.bz2
Ishtar-3808df22596ff03e8b24c9b97506f68c86197c60.zip
Sheet actions: add duplicate for site, operation, document and context record
Diffstat (limited to 'archaeological_context_records')
-rw-r--r--archaeological_context_records/forms.py105
-rw-r--r--archaeological_context_records/models.py19
-rw-r--r--archaeological_context_records/templates/ishtar/forms/qa_contextrecord_duplicate.html39
-rw-r--r--archaeological_context_records/templates/ishtar/sheet_contextrecord.html16
-rw-r--r--archaeological_context_records/urls.py4
-rw-r--r--archaeological_context_records/views.py23
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