summaryrefslogtreecommitdiff
path: root/archaeological_operations/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'archaeological_operations/models.py')
-rw-r--r--archaeological_operations/models.py500
1 files changed, 495 insertions, 5 deletions
diff --git a/archaeological_operations/models.py b/archaeological_operations/models.py
index 48baa57ba..9b3631114 100644
--- a/archaeological_operations/models.py
+++ b/archaeological_operations/models.py
@@ -23,7 +23,8 @@ from django.db.models.signals import post_save
from django.utils.translation import ugettext_lazy as _, ugettext
from ishtar_common.models import GeneralType, BaseHistorizedItem, \
- HistoricalRecords, OwnPerms, Department, Source, Person, Organization, Town
+ HistoricalRecords, LightHistorizedItem, OwnPerms, Department, Source,\
+ Person, Organization, Town, Dashboard
FILES_AVAILABLE = 'archaeological_files' in settings.INSTALLED_APPS
if FILES_AVAILABLE:
from archaeological_files.models import File
@@ -288,13 +289,502 @@ related_name='+', verbose_name=_(u"Person in charge of the scientific part"))
verbose_name = _(u"Administrative act")
verbose_name_plural = _(u"Administrative acts")
permissions = (
-("view_own_administrativeact", ugettext(u"Can view own Administrative act")),
-("add_own_administrativeact", ugettext(u"Can add own Administrative act")),
-("change_own_administrativeact", ugettext(u"Can change own Administrative act")),
-("delete_own_administrativeact", ugettext(u"Can delete own Administrative act")),
+ ("view_own_administrativeact",
+ ugettext(u"Can view own Administrative act")),
+ ("add_own_administrativeact",
+ ugettext(u"Can add own Administrative act")),
+ ("change_own_administrativeact",
+ ugettext(u"Can change own Administrative act")),
+ ("delete_own_administrativeact",
+ ugettext(u"Can delete own Administrative act")),
)
def __unicode__(self):
return JOINT.join([unicode(item)
for item in [self.operation, self.associated_file, self.act_object]
if item])
+
+class Parcel(LightHistorizedItem):
+ if FILES_AVAILABLE:
+ associated_file = models.ForeignKey(File, related_name='parcels',
+ blank=True, null=True, verbose_name=_(u"File"))
+ operation = models.ForeignKey(Operation, related_name='parcels', blank=True,
+ null=True, verbose_name=_(u"Operation"))
+ year = models.IntegerField(_(u"Year"), blank=True, null=True)
+ town = models.ForeignKey(Town, related_name='parcels',
+ verbose_name=_(u"Town"))
+ section = models.CharField(_(u"Section"), max_length=4)
+ parcel_number = models.CharField(_(u"Parcel number"), max_length=6)
+
+ class Meta:
+ verbose_name = _(u"Parcel")
+ verbose_name_plural = _(u"Parcels")
+
+ def short_label(self):
+ return JOINT.join([unicode(item) for item in [self.section,
+ self.parcel_number] if item])
+
+ def __unicode__(self):
+ return self.short_label()
+
+ def long_label(self):
+ items = [unicode(self.operation or self.associated_file)]
+ items += [unicode(item) for item in [self.section, self.parcel_number]
+ if item]
+ return JOINT.join(items)
+
+class ParcelOwner(LightHistorizedItem):
+ owner = models.ForeignKey(Person, verbose_name=_(u"Owner"))
+ parcel = models.ForeignKey(Parcel, verbose_name=_(u"Parcel"))
+ start_date = models.DateField(_(u"Start date"))
+ end_date = models.DateField(_(u"End date"))
+
+ class Meta:
+ verbose_name = _(u"Parcel owner")
+ verbose_name_plural = _(u"Parcel owners")
+
+ def __unicode__(self):
+ return self.owner + JOINT + self.parcel
+
+class OperationDashboard:
+ def __init__(self):
+ main_dashboard = Dashboard(Operation)
+
+ self.total_number = main_dashboard.total_number
+
+ self.filters_keys = ['recorded', 'effective', 'active', 'field',
+ 'documented', 'closed', 'documented_closed']
+ filters = {
+ 'recorded':{},
+ 'effective':{'in_charge__isnull':False},
+ 'active':{'in_charge__isnull':False, 'end_date__isnull':True},
+ 'field':{'excavation_end_date__isnull':True},
+ 'documented':{'source__isnull':False},
+ 'documented_closed':{'source__isnull':False,
+ 'end_date__isnull':False},
+ 'closed':{'end_date__isnull':False}
+ }
+ filters_label = {
+ 'recorded':_(u"Recorded"),
+ 'effective':_(u"Effective"),
+ 'active':_(u"Active"),
+ 'field':_(u"Field completed"),
+ 'documented':_(u"Associated report"),
+ 'closed':_(u"Closed"),
+ 'documented_closed':_(u"Documented and closed"),
+ }
+ self.filters_label = [filters_label[k] for k in self.filters_keys]
+ self.total = []
+ for fltr_key in self.filters_keys:
+ fltr, lbl = filters[fltr_key], filters_label[fltr_key]
+ nb = Operation.objects.filter(**fltr).count()
+ self.total.append((lbl, nb))
+
+ self.surface_by_type = Operation.objects\
+ .values('operation_type__label')\
+ .annotate(number=Sum('surface'))\
+ .order_by('-number','operation_type__label')
+
+ self.by_type = []
+ self.types = OperationType.objects.filter(available=True).all()
+ for fltr_key in self.filters_keys:
+ fltr, lbl = filters[fltr_key], filters_label[fltr_key]
+ type_res = Operation.objects.filter(**fltr).\
+ values('operation_type', 'operation_type__label').\
+ annotate(number=Count('pk')).\
+ order_by('operation_type')
+ types_dct = {}
+ for typ in type_res.all():
+ types_dct[typ['operation_type']] = typ["number"]
+ types = []
+ for typ in self.types:
+ if typ.pk in types_dct:
+ types.append(types_dct[typ.pk])
+ else:
+ types.append(0)
+ self.by_type.append((lbl, types))
+
+ self.by_year = []
+ self.years = [res['year'] for res in Operation.objects.values('year')\
+ .order_by('-year').distinct()]
+ for fltr_key in self.filters_keys:
+ fltr, lbl = filters[fltr_key], filters_label[fltr_key]
+ year_res = Operation.objects.filter(**fltr).\
+ values('year').\
+ annotate(number=Count('pk')).\
+ order_by('year')
+ years_dct = {}
+ for yr in year_res.all():
+ years_dct[yr['year']] = yr["number"]
+ years = []
+ for yr in self.years:
+ if yr in years_dct:
+ years.append(years_dct[yr])
+ else:
+ years.append(0)
+ self.by_year.append((lbl, years))
+
+ self.by_realisation_year = []
+ self.realisation_years = [res['date'] for res in \
+ Operation.objects.extra(
+ {'date':"date_trunc('year', start_date)"}).values('date')\
+ .filter(start_date__isnull=False).order_by('-date').distinct()]
+ for fltr_key in self.filters_keys:
+ fltr, lbl = filters[fltr_key], filters_label[fltr_key]
+ year_res = Operation.objects.filter(**fltr).extra(
+ {'date':"date_trunc('year', start_date)"}).values('date').\
+ values('date').filter(start_date__isnull=False).\
+ annotate(number=Count('pk')).\
+ order_by('-date')
+ years_dct = {}
+ for yr in year_res.all():
+ years_dct[yr['date']] = yr["number"]
+ years = []
+ for yr in self.realisation_years:
+ if yr in years_dct:
+ years.append(years_dct[yr])
+ else:
+ years.append(0)
+ self.by_realisation_year.append((lbl, years))
+
+ self.effective = []
+ for typ in self.types:
+ year_res = Operation.objects.filter(**{'in_charge__isnull':False,
+ 'operation_type':typ}).\
+ values('year').\
+ annotate(number=Count('pk')).\
+ order_by('-year').distinct()
+ years_dct = {}
+ for yr in year_res.all():
+ years_dct[yr['year']] = yr["number"]
+ years = []
+ for yr in self.years:
+ if yr in years_dct:
+ years.append(years_dct[yr])
+ else:
+ years.append(0)
+ self.effective.append((typ, years))
+
+ # TODO: by date
+ now = datetime.date.today()
+ limit = datetime.date(now.year, now.month, 1) - datetime.timedelta(365)
+ by_realisation_month = Operation.objects.filter(start_date__gt=limit,
+ start_date__isnull=False).extra(
+ {'date':"date_trunc('month', start_date)"})
+ self.last_months = []
+ date = datetime.datetime(now.year, now.month, 1)
+ for mt_idx in xrange(12):
+ self.last_months.append(date)
+ if date.month > 1:
+ date = datetime.datetime(date.year, date.month - 1, 1)
+ else:
+ date = datetime.datetime(date.year - 1, 12, 1)
+ self.by_realisation_month = []
+ for fltr_key in self.filters_keys:
+ fltr, lbl = filters[fltr_key], filters_label[fltr_key]
+ month_res = by_realisation_month.filter(**fltr).\
+ annotate(number=Count('pk')).\
+ order_by('-date')
+ month_dct = {}
+ for mt in month_res.all():
+ month_dct[mt.date] = mt.number
+ date = datetime.date(now.year, now.month, 1)
+ months = []
+ for date in self.last_months:
+ if date in month_dct:
+ months.append(month_dct[date])
+ else:
+ months.append(0)
+ self.by_realisation_month.append((lbl, months))
+
+ # survey and excavations
+ self.survey, self.excavation = {}, {}
+ for dct_res, ope_types in ((self.survey, ('arch_diagnostic',)),
+ (self.excavation, ('prev_excavation',
+ 'prog_excavation'))):
+ dct_res['total'] = []
+ operation_type = {'operation_type__txt_idx__in':ope_types}
+ for fltr_key in self.filters_keys:
+ fltr, lbl = filters[fltr_key], filters_label[fltr_key]
+ fltr.update(operation_type)
+ nb = Operation.objects.filter(**fltr).count()
+ dct_res['total'].append((lbl, nb))
+
+ dct_res['by_year'] = []
+ for fltr_key in self.filters_keys:
+ fltr, lbl = filters[fltr_key], filters_label[fltr_key]
+ fltr.update(operation_type)
+ year_res = Operation.objects.filter(**fltr).\
+ values('year').\
+ annotate(number=Count('pk')).\
+ order_by('year')
+ years_dct = {}
+ for yr in year_res.all():
+ years_dct[yr['year']] = yr["number"]
+ years = []
+ for yr in self.years:
+ if yr in years_dct:
+ years.append(years_dct[yr])
+ else:
+ years.append(0)
+ dct_res['by_year'].append((lbl, years))
+
+ dct_res['by_realisation_year'] = []
+ for fltr_key in self.filters_keys:
+ fltr, lbl = filters[fltr_key], filters_label[fltr_key]
+ fltr.update(operation_type)
+ year_res = Operation.objects.filter(**fltr).extra(
+ {'date':"date_trunc('year', start_date)"}).values('date').\
+ filter(start_date__isnull=False).\
+ annotate(number=Count('pk')).\
+ order_by('-date')
+ years_dct = {}
+ for yr in year_res.all():
+ years_dct[yr['date']] = yr["number"]
+ years = []
+ for yr in self.realisation_years:
+ if yr in years_dct:
+ years.append(years_dct[yr])
+ else:
+ years.append(0)
+ dct_res['by_realisation_year'].append((lbl, years))
+
+ current_year_ope = Operation.objects.filter(**operation_type)\
+ .filter(year=datetime.date.today().year)
+ current_realisation_year_ope = Operation.objects\
+ .filter(**operation_type)\
+ .filter(start_date__year=datetime.date.today().year)
+ res_keys = [('area_realised', current_realisation_year_ope)]
+ if dct_res == self.survey:
+ res_keys.append(('area',
+ current_year_ope))
+ for res_key, base_ope in res_keys:
+ dct_res[res_key] = []
+ for fltr_key in self.filters_keys:
+ fltr, lbl = filters[fltr_key], filters_label[fltr_key]
+ area_res = base_ope.filter(**fltr)\
+ .annotate(number=Sum('surface')).all()
+ val = 0
+ if area_res:
+ val = area_res[0].number
+ dct_res[res_key].append(val)
+ # TODO...
+ res_keys = [('manday_realised', current_realisation_year_ope)]
+ if dct_res == self.survey:
+ res_keys.append(('manday',
+ current_year_ope))
+ for res_key, base_ope in res_keys:
+ dct_res[res_key] = []
+ for fltr_key in self.filters_keys:
+ dct_res[res_key].append('-')
+ # TODO...
+ res_keys = [('mandayhect_realised', current_realisation_year_ope)]
+ if dct_res == self.survey:
+ res_keys.append(('mandayhect',
+ current_year_ope))
+ for res_key, base_ope in res_keys:
+ dct_res[res_key] = []
+ for fltr_key in self.filters_keys:
+ dct_res[res_key].append('-')
+ # TODO...
+ dct_res['mandayhect_real_effective'] = '-'
+ if dct_res == self.survey:
+ dct_res['mandayhect_effective'] = '-'
+
+
+ res_keys = [('org_realised', current_realisation_year_ope)]
+ if dct_res == self.survey:
+ res_keys.append(('org', current_year_ope))
+ for res_key, base_ope in res_keys:
+ org_res = base_ope.filter(in_charge__attached_to__isnull=False)\
+ .values('in_charge__attached_to',
+ 'in_charge__attached_to__name')\
+ .annotate(area=Sum('surface'))\
+ .order_by('in_charge__attached_to__name').all()
+ # TODO: man-days, man-days/hectare
+ dct_res[res_key] = org_res
+
+
+ year_ope = Operation.objects.filter(**operation_type)
+ res_keys = ['org_by_year']
+ if dct_res == self.survey:
+ res_keys.append('org_by_year_realised')
+ q = year_ope.values('in_charge__attached_to',
+ 'in_charge__attached_to__name').\
+ filter(in_charge__attached_to__isnull=False).\
+ order_by('in_charge__attached_to__name').distinct()
+ org_list = [(org['in_charge__attached_to'],
+ org['in_charge__attached_to__name']) for org in q]
+ org_list_dct = dict(org_list)
+ for res_key in res_keys:
+ dct_res[res_key] = []
+ years = self.years
+ if res_key == 'org_by_year_realised':
+ years = self.realisation_years
+ for org_id, org_label in org_list:
+ org_res = year_ope.filter(in_charge__attached_to__pk=org_id)
+ key_date = ''
+ if res_key == 'org_by_year':
+ org_res = org_res.values('year')
+ key_date = 'year'
+ else:
+ org_res = org_res.extra(
+ {'date':"date_trunc('year', start_date)"}).values('date').\
+ filter(start_date__isnull=False)
+ key_date = 'date'
+ org_res = org_res.annotate(area=Sum('surface'),
+ cost=Sum('cost'))
+ years_dct = {}
+ for yr in org_res.all():
+ area = yr['area'] if yr['area'] else 0
+ cost = yr['cost'] if yr['cost'] else 0
+ years_dct[yr[key_date]] = (area, cost)
+ r_years = []
+ for yr in years:
+ if yr in years_dct:
+ r_years.append(years_dct[yr])
+ else:
+ r_years.append((0, 0))
+ dct_res[res_key].append((org_label, r_years))
+ area_means, area_sums = [], []
+ cost_means, cost_sums = [], []
+ for idx, year in enumerate(years):
+ vals = [r_years[idx] for lbl, r_years in dct_res[res_key]]
+ sum_area = sum([a for a, c in vals])
+ sum_cost = sum([c for a, c in vals])
+ area_means.append(sum_area/len(vals))
+ area_sums.append(sum_area)
+ cost_means.append(sum_cost/len(vals))
+ cost_sums.append(sum_cost)
+ dct_res[res_key+'_area_mean'] = area_means
+ dct_res[res_key+'_area_sum'] = area_sums
+ dct_res[res_key+'_cost_mean'] = cost_means
+ dct_res[res_key+'_cost_mean'] = cost_sums
+
+ if dct_res == self.survey:
+ self.survey['effective'] = []
+ for yr in self.years:
+ year_res = Operation.objects.filter(in_charge__isnull=False,
+ year=yr).\
+ annotate(number=Sum('surface'),
+ mean=Avg('surface'))
+ nb = year_res[0].number if year_res.count() else 0
+ nb = nb if nb else 0
+ mean = year_res[0].mean if year_res.count() else 0
+ mean = mean if mean else 0
+ self.survey['effective'].append((nb, mean))
+
+ # TODO:Man-Days/hectare by Year
+
+ # CHECK: month of realisation or month?
+ dct_res['by_month'] = []
+ for fltr_key in self.filters_keys:
+ fltr, lbl = filters[fltr_key], filters_label[fltr_key]
+ fltr.update(operation_type)
+ month_res = by_realisation_month.filter(**fltr).\
+ annotate(number=Count('pk')).\
+ order_by('-date')
+ month_dct = {}
+ for mt in month_res.all():
+ month_dct[mt.date] = mt.number
+ date = datetime.date(now.year, now.month, 1)
+ months = []
+ for date in self.last_months:
+ if date in month_dct:
+ months.append(month_dct[date])
+ else:
+ months.append(0)
+ dct_res['by_month'].append((lbl, months))
+
+ operation_type = {'operation_type__txt_idx__in':ope_types}
+ self.departments = [(fd['department__pk'], fd['department__label'])
+ for fd in OperationByDepartment.objects\
+ .filter(department__isnull=False)\
+ .values('department__label', 'department__pk')\
+ .order_by('department__label').distinct()]
+ dct_res['by_dpt'] = []
+ for dpt_id, dpt_label in self.departments:
+ vals = OperationByDepartment.objects\
+ .filter(department__pk=dpt_id,
+ operation__operation_type__txt_idx__in=ope_types)\
+ .values('department__pk', 'operation__year')\
+ .annotate(number=Count('operation'))\
+ .order_by('operation__year')
+ dct_years = {}
+ for v in vals:
+ dct_years[v['operation__year']] = v['number']
+ years = []
+ for y in self.years:
+ if y in dct_years:
+ years.append(dct_years[y])
+ else:
+ years.append(0)
+ years.append(sum(years))
+ dct_res['by_dpt'].append((dpt_label, years))
+ dct_res['effective_by_dpt'] = []
+ for dpt_id, dpt_label in self.departments:
+ vals = OperationByDepartment.objects\
+ .filter(department__pk=dpt_id,
+ operation__in_charge__isnull=False,
+ operation__operation_type__txt_idx__in=ope_types)\
+ .values('department__pk', 'operation__year')\
+ .annotate(number=Count('operation'),
+ area=Sum('operation__surface'),
+ fnap=Sum('operation__fnap_cost'),
+ cost=Sum('operation__cost'))\
+ .order_by('operation__year')
+ dct_years = {}
+ for v in vals:
+ values = []
+ for value in (v['number'], v['area'], v['cost'], v['fnap']):
+ values.append(value if value else 0)
+ dct_years[v['operation__year']] = values
+ years = []
+ for y in self.years:
+ if y in dct_years:
+ years.append(dct_years[y])
+ else:
+ years.append((0, 0, 0, 0))
+ nbs, areas, costs, fnaps = zip(*years)
+ years.append((sum(nbs), sum(areas), sum(costs), sum(fnaps)))
+ dct_res['effective_by_dpt'].append((dpt_label, years))
+
+ OperationTown = Operation.towns.through
+ query = OperationTown.objects\
+ .filter(operation__in_charge__isnull=False,
+ operation__operation_type__txt_idx__in=ope_types)\
+ .values('town__name', 'town__departement__number')\
+ .annotate(nb=Count('operation'))\
+ .order_by('-nb', 'town__name')[:10]
+ dct_res['towns'] = []
+ for r in query:
+ dct_res['towns'].append((u"%s (%s)" % (r['town__name'],
+ r['town__departement__number']),
+ r['nb']))
+
+ if dct_res == self.survey:
+ query = OperationTown.objects\
+ .filter(operation__in_charge__isnull=False,
+ operation__operation_type__txt_idx__in=ope_types,
+ operation__surface__isnull=False)\
+ .values('town__name', 'town__departement__number')\
+ .annotate(nb=Sum('operation__surface'))\
+ .order_by('-nb', 'town__name')[:10]
+ dct_res['towns_surface'] = []
+ for r in query:
+ dct_res['towns_surface'].append((u"%s (%s)" % (
+ r['town__name'], r['town__departement__number']),
+ r['nb']))
+ else:
+ query = OperationTown.objects\
+ .filter(operation__in_charge__isnull=False,
+ operation__operation_type__txt_idx__in=ope_types,
+ operation__cost__isnull=False)\
+ .values('town__name', 'town__departement__number')\
+ .annotate(nb=Sum('operation__cost'))\
+ .order_by('-nb', 'town__name')[:10]
+ dct_res['towns_cost'] = []
+ for r in query:
+ dct_res['towns_cost'].append((u"%s (%s)" % (r['town__name'],
+ r['town__departement__number']),
+ r['nb']))