summaryrefslogtreecommitdiff
path: root/archaeological_context_records/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'archaeological_context_records/models.py')
-rw-r--r--archaeological_context_records/models.py85
1 files changed, 81 insertions, 4 deletions
diff --git a/archaeological_context_records/models.py b/archaeological_context_records/models.py
index 377cea087..1ec32ea83 100644
--- a/archaeological_context_records/models.py
+++ b/archaeological_context_records/models.py
@@ -20,6 +20,7 @@
from django.conf import settings
from django.contrib.gis.db import models
from django.core.urlresolvers import reverse
+from django.db import connection, transaction
from django.db.models import Q
from django.db.models.signals import post_delete, post_save
from django.utils.translation import ugettext_lazy as _, ugettext, pgettext
@@ -76,8 +77,9 @@ class Dating(models.Model):
class Unit(GeneralType):
order = models.IntegerField(_(u"Order"))
- parent = models.ForeignKey("Unit", verbose_name=_(u"Parent context record type"),
- blank=True, null=True)
+ parent = models.ForeignKey(
+ "Unit", verbose_name=_(u"Parent context record type"),
+ blank=True, null=True)
class Meta:
verbose_name = _(u"Context record Type")
@@ -118,6 +120,26 @@ post_save.connect(post_save_cache, sender=IdentificationType)
post_delete.connect(post_save_cache, sender=IdentificationType)
+class CRBulkView(object):
+ CREATE_SQL = """
+ CREATE VIEW context_records_cached_label_bulk_update
+ AS (
+ SELECT cr.id AS id, ope.code_patriarche AS main_code,
+ ope.year AS year,
+ ope.operation_code AS ope_code,
+ parcel.section AS section,
+ parcel.parcel_number AS number, cr.label AS label
+ FROM archaeological_context_records_contextrecord AS cr
+ INNER JOIN archaeological_operations_operation ope
+ ON ope.id = cr.operation_id
+ INNER JOIN archaeological_operations_parcel parcel
+ ON cr.parcel_id = parcel.id
+ );"""
+ DELETE_SQL = """
+ DROP VIEW context_records_cached_label_bulk_update;
+ """
+
+
class ContextRecord(BaseHistorizedItem, ImageModel, OwnPerms,
ValueGetter, ShortMenuItem):
SHOW_URL = 'show-contextrecord'
@@ -193,8 +215,8 @@ class ContextRecord(BaseHistorizedItem, ImageModel, OwnPerms,
datings = models.ManyToManyField(Dating)
datings_comment = models.TextField(_(u"Comment on datings"), blank=True,
null=True)
- unit = models.ForeignKey(Unit, verbose_name=_(u"Context record type"), related_name='+',
- blank=True, null=True)
+ unit = models.ForeignKey(Unit, verbose_name=_(u"Context record type"),
+ related_name='+', blank=True, null=True)
has_furniture = models.NullBooleanField(_(u"Has furniture?"), blank=True,
null=True)
filling = models.TextField(_(u"Filling"), blank=True, null=True)
@@ -253,6 +275,61 @@ class ContextRecord(BaseHistorizedItem, ImageModel, OwnPerms,
def __unicode__(self):
return self.short_label
+ @classmethod
+ def cached_label_bulk_update(cls, operation_id=None, parcel_id=None):
+ if operation_id:
+ where = "operation_id = %s"
+ args = [int(operation_id)]
+ kwargs = {'operation_id': operation_id}
+ elif parcel_id:
+ where = "parcel_id = %s"
+ args = [int(parcel_id)]
+ kwargs = {'parcel_id': parcel_id}
+ else:
+ return
+ sql = """
+ UPDATE "archaeological_context_records_contextrecord" AS cr
+ SET cached_label =
+ CASE
+ WHEN context_records_cached_label_bulk_update.main_code
+ IS NULL
+ THEN
+ CASE
+ WHEN context_records_cached_label_bulk_update.year
+ IS NOT NULL
+ AND context_records_cached_label_bulk_update.ope_code
+ IS NOT NULL
+ THEN
+ '{ope_prefix}' ||
+ context_records_cached_label_bulk_update.year ||
+ '-' ||
+ context_records_cached_label_bulk_update.ope_code
+ ELSE ''
+ END
+ ELSE
+ '{main_ope_prefix}' ||
+ context_records_cached_label_bulk_update.main_code
+ END
+ || '{join}' ||
+ context_records_cached_label_bulk_update.section || '{join}' ||
+ context_records_cached_label_bulk_update.number || '{join}' ||
+ context_records_cached_label_bulk_update.label
+ FROM context_records_cached_label_bulk_update
+ WHERE cr.id = context_records_cached_label_bulk_update.id
+ AND cr.id IN (
+ SELECT id FROM archaeological_context_records_contextrecord
+ WHERE {where}
+ );
+ """.format(main_ope_prefix=settings.ISHTAR_OPE_PREFIX,
+ ope_prefix=settings.ISHTAR_DEF_OPE_PREFIX,
+ join=settings.JOINT, where=where)
+ # with connection.cursor() as c: # django 1.8
+ c = connection.cursor()
+ c.execute(sql, args)
+ transaction.commit_unless_managed()
+ cls._meta.get_field_by_name(
+ 'base_finds')[0].model.cached_label_bulk_update(**kwargs)
+
@property
def short_label(self):
return settings.JOINT.join([unicode(item) for item in [