diff options
Diffstat (limited to 'archaeological_files/admin.py')
-rw-r--r-- | archaeological_files/admin.py | 101 |
1 files changed, 100 insertions, 1 deletions
diff --git a/archaeological_files/admin.py b/archaeological_files/admin.py index edc6be716..df2afd677 100644 --- a/archaeological_files/admin.py +++ b/archaeological_files/admin.py @@ -19,7 +19,13 @@ from ajax_select import make_ajax_form +from django import forms from django.conf import settings +from django.conf.urls import url +from django.core.urlresolvers import reverse +from django.http import HttpResponseRedirect +from django.shortcuts import get_object_or_404, render +from django.utils.translation import ugettext_lazy as _ from ishtar_common.apps import admin_site from ishtar_common.admin import ( @@ -87,6 +93,7 @@ class JobAdmin(GeneralTypeAdmin): list_filter = ("available", "price_agreement") LIST_DISPLAY = [ "label", + "price_agreement", "permanent_contract", "order", "ground_daily_cost", @@ -116,6 +123,7 @@ class EquipmentServiceCostAdmin(ImportActionAdmin): list_filter = ("available", "price_agreement") list_display = [ "equipment_service_type", + "price_agreement", "specificity", "parent", "unitary_cost", @@ -130,7 +138,98 @@ class EquipmentServiceCostAdmin(ImportActionAdmin): admin_site.register(models.EquipmentServiceCost, EquipmentServiceCostAdmin) -class PriceAgreementAdmin(GeneralTypeAdmin): +class CopyPriceForm(forms.Form): + source = forms.ChoiceField( + label=_("Copy from"), + choices=[], + ) + destination = forms.ChoiceField( + label=_("To"), + choices=[], + ) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + choices = [ + (idx, label) + for idx, label in models.PriceAgreement.objects.values_list("id", "label") + ] + self.fields["source"].choices = choices + self.fields["destination"].choices = choices + + def clean(self): + if self.cleaned_data.get("source", None) \ + == self.cleaned_data.get("destination", None): + raise forms.ValidationError( + _("Source and destination must be different.") + ) + return self.cleaned_data + + +class CopyPriceAgreementAdmin(GeneralTypeAdmin): + change_list_template = "admin/copy_price_change_list.html" + + def get_urls(self): + urls = super(CopyPriceAgreementAdmin, self).get_urls() + my_urls = [ + url(r"^copy-price-agreement/$", self.copy_price_agreement), + ] + return my_urls + urls + + def copy_price_agreement(self, request): + form = None + + if "apply" in request.POST: + form = CopyPriceForm(request.POST) + if form.is_valid(): + created, already_here = 0, 0 + source = get_object_or_404( + models.PriceAgreement, pk=form.cleaned_data["source"] + ) + destination = get_object_or_404( + models.PriceAgreement, pk=form.cleaned_data["destination"] + ) + for model, slug_name in ((models.Job, "txt_idx"), + (models.EquipmentServiceCost, "slug")): + items = model.objects.filter(price_agreement_id=source.pk).all() + for item in items: + slug = getattr(item, slug_name).split("--")[0] + "--" + \ + str(source.pk) + q = model.objects.filter(**{slug_name: slug}) + if q.count(): + already_here += 1 + continue + new_item = item + new_item.pk = None + setattr(new_item, slug_name, slug) + new_item.price_agreement_id = destination.pk + new_item.save() + created += 1 + if created: + self.message_user( + request, str(_("{} item(s) created.")).format(created) + ) + if already_here: + self.message_user( + request, str(_("{} item(s) already in database.")).format( + already_here) + ) + c_url = reverse( + "admin:{}_{}_changelist".format( + self.model._meta.app_label, self.model._meta.model_name + ) + ) + return HttpResponseRedirect(c_url) + if not form: + form = CopyPriceForm() + return render( + request, + "admin/copy_price.html", + {"file_form": form, "current_action": "import_generic"}, + ) + + +class PriceAgreementAdmin(CopyPriceAgreementAdmin): list_filter = ("available",) extra_list_display = [ "start_date", |