summaryrefslogtreecommitdiff
path: root/ishtar_common/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'ishtar_common/models.py')
-rw-r--r--ishtar_common/models.py568
1 files changed, 1 insertions, 567 deletions
diff --git a/ishtar_common/models.py b/ishtar_common/models.py
index 4406a2b86..b4bf2cd57 100644
--- a/ishtar_common/models.py
+++ b/ishtar_common/models.py
@@ -398,570 +398,6 @@ class UserDashboard:
self.types = types.annotate(number=Count('pk'))\
.order_by('person__person_type')
-class FileDashboard:
- def __init__(self):
- main_dashboard = Dashboard(File)
-
- self.total_number = main_dashboard.total_number
-
- types = File.objects.values('file_type', 'file_type__label')
- self.types = types.annotate(number=Count('pk')).order_by('file_type')
-
- by_year = File.objects.extra(
- {'date':"date_trunc('year', creation_date)"})
- self.by_year = by_year.values('date')\
- .annotate(number=Count('pk')).order_by('-date')
-
- now = datetime.date.today()
- limit = datetime.date(now.year, now.month, 1) - datetime.timedelta(365)
- by_month = File.objects.filter(creation_date__gt=limit).extra(
- {'date':"date_trunc('month', creation_date)"})
- self.by_month = by_month.values('date')\
- .annotate(number=Count('pk')).order_by('-date')
-
- # research
- self.research = {}
- prog_type = FileType.objects.get(txt_idx='prog')
- researchs = File.objects.filter(file_type=prog_type)
- self.research['total_number'] = researchs.count()
- by_year = researchs.extra({'date':"date_trunc('year', creation_date)"})
- self.research['by_year'] = by_year.values('date')\
- .annotate(number=Count('pk'))\
- .order_by('-date')
- by_month = researchs.filter(creation_date__gt=limit)\
- .extra({'date':"date_trunc('month', creation_date)"})
- self.research['by_month'] = by_month.values('date')\
- .annotate(number=Count('pk'))\
- .order_by('-date')
-
- self.research['by_dpt'] = FileByDepartment.objects\
- .filter(file__file_type=prog_type,
- department__isnull=False)\
- .values('department__label')\
- .annotate(number=Count('file'))\
- .order_by('department__label')
- FileTown = File.towns.through
- self.research['towns'] = FileTown.objects\
- .filter(file__file_type=prog_type)\
- .values('town__name')\
- .annotate(number=Count('file'))\
- .order_by('-number','town__name')[:10]
-
- # rescue
- rescue_type = FileType.objects.get(txt_idx='preventive')
- rescues = File.objects.filter(file_type=rescue_type)
- self.rescue = {}
- self.rescue['total_number'] = rescues.count()
- self.rescue['saisine'] = rescues.values('saisine_type__label')\
- .annotate(number=Count('pk'))\
- .order_by('saisine_type__label')
- self.rescue['administrative_act'] = AdministrativeAct.objects\
- .filter(associated_file__isnull=False)\
- .values('act_type__label')\
- .annotate(number=Count('pk'))\
- .order_by('act_type__pk')
-
- by_year = rescues.extra({'date':"date_trunc('year', creation_date)"})
- self.rescue['by_year'] = by_year.values('date')\
- .annotate(number=Count('pk'))\
- .order_by('-date')
- by_month = rescues.filter(creation_date__gt=limit)\
- .extra({'date':"date_trunc('month', creation_date)"})
- self.rescue['by_month'] = by_month.values('date')\
- .annotate(number=Count('pk'))\
- .order_by('-date')
-
- self.rescue['by_dpt'] = FileByDepartment.objects\
- .filter(file__file_type=rescue_type,
- department__isnull=False)\
- .values('department__label')\
- .annotate(number=Count('file'))\
- .order_by('department__label')
- self.rescue['towns'] = FileTown.objects\
- .filter(file__file_type=rescue_type)\
- .values('town__name')\
- .annotate(number=Count('file'))\
- .order_by('-number','town__name')[:10]
-
- self.rescue['with_associated_operation'] = rescues\
- .filter(operations__isnull=False).count()
-
- self.rescue['with_associated_operation_percent'] = round(
- float(self.rescue['with_associated_operation'])\
- /self.rescue['total_number']*100, 2)
-
- by_year_operationnal = rescues.filter(operations__isnull=False)\
- .extra({'date':"date_trunc('year', creation_date)"})
- by_year_operationnal = by_year_operationnal.values('date')\
- .annotate(number=Count('pk'))\
- .order_by('-date')
- percents, idx = [], 0
- for dct in self.rescue['by_year']:
- if idx > len(by_year_operationnal):
- break
- if by_year_operationnal[idx]['date'] != dct['date'] or\
- not dct['number']:
- continue
- val = round(float(by_year_operationnal[idx]['number'])/\
- dct['number']*100, 2)
- percents.append({'date':dct['date'], 'number':val})
- self.rescue['operational_by_year'] = percents
-
- self.rescue['surface_by_town'] = FileTown.objects\
- .filter(file__file_type=rescue_type)\
- .values('town__name')\
- .annotate(number=Sum('file__total_surface'))\
- .order_by('-number','town__name')[:10]
- self.rescue['surface_by_dpt'] = FileByDepartment.objects\
- .filter(file__file_type=rescue_type,
- department__isnull=False)\
- .values('department__label')\
- .annotate(number=Sum('file__total_surface'))\
- .order_by('department__label')
-
-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']))
-
class Dashboard:
def __init__(self, model):
self.model = model
@@ -973,7 +409,7 @@ class Dashboard:
last_ids = history_model.objects.values('id')\
.annotate(hd=Max('history_date'))
last_ids = last_ids.filter(history_type=modif_type)
- if self.model == Item:
+ if self.model == Find:
last_ids = last_ids.filter(downstream_treatment_id__isnull=True)
if modif_type == '+':
last_ids = last_ids.filter(upstream_treatment_id__isnull=True)
@@ -1252,5 +688,3 @@ class Town(models.Model):
if settings.COUNTRY == "fr":
return u"%s (%s)" % (self.name, self.numero_insee)
return self.name
-
-