#!/usr/bin/env python # -*- coding: utf-8 -*- # Copyright (C) 2010 Étienne Loks # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # See the file COPYING for details. """ Models description """ from django.utils.translation import ugettext_lazy as _ from django.contrib.auth.models import User, UserManager from django.contrib.gis.db import models from django.contrib import admin from simple_history.models import HistoricalRecords from ishtar import settings class GeneralType(models.Model): """ Abstract class for "types" """ label = models.CharField(_(u"Label"), max_length=30) comment = models.TextField(_(u"Comment")) class Meta: abstract = True def __unicode__(self): return self.label class Departement(models.Model): label = models.CharField(_(u"Label"), max_length=30) number = models.IntegerField(_(u"Number")) class Meta: verbose_name = _(u"Departement") verbose_name_plural = _(u"Departements") def __unicode__(self): return unicode(self.number) + u" - " + self.label class Address(models.Model): address = models.TextField(_(u"Address")) address_complement = models.TextField(_(u"Address complement")) postal_code = models.CharField(_(u"Postal code"), max_length=10) town = models.CharField(_(u"Town"), max_length=30) country = models.CharField(_(u"Country"), max_length=30) phone = models.CharField(_(u"Phone"), max_length=18) mobile_phone = models.CharField(_(u"Mobile phone"), max_length=18) class Meta: abstract = True class OrganizationType(GeneralType): class Meta: verbose_name = _(u"Organization type") verbose_name_plural = _(u"Organization types") class Organization(models.Model): name = models.CharField(_(u"Name"), max_length=60) person_type = models.ForeignKey(OrganizationType, verbose_name=_(u"Type")) class Meta: verbose_name = _(u"Organization") verbose_name_plural = _(u"Organizations") class PersonType(GeneralType): class Meta: verbose_name = _(u"Person type") verbose_name_plural = _(u"Person types") class Person(Address) : TYPE = (('Mr', _(u'Mr')), ('Ms', _(u'Miss')), ('Md', _(u'Mrs')), ('Dr', _(u'Doctor')), ) title = models.CharField(_(u"Title"), max_length=1, choices=TYPE) surname = models.CharField(_(u"Surname"), max_length=20) name = models.CharField(_(u"Name"), max_length=30) email = models.CharField(_(u"Email"), max_length=40) person_type = models.ForeignKey(PersonType, verbose_name=_(u"Type")) attached_to = models.ForeignKey('Organization', verbose_name=_(u"Is attached to")) is_author = models.BooleanField(_(u"Is an author?")) in_charge_storage = models.BooleanField(_(u"In charge of a storage?")) class Meta: verbose_name = _(u"Person") verbose_name_plural = _(u"Persons") def __unicode__(self): return u"%s %s" % (self.name, self.surname) class IshtarUser(models.Model): user = models.ForeignKey(User, unique=True, related_name='profile', verbose_name=_(u"User")) person = models.ForeignKey(Person, verbose_name=_(u"Person")) class Meta: verbose_name = _(u"Ishtar user") verbose_name_plural = _(u"Ishtar users") class FileType(GeneralType): class Meta: verbose_name = _(u"Archaeological file type") verbose_name_plural = _(u"Archaeological file types") class File(models.Model) : year = models.IntegerField(_(u"Year")) number = models.IntegerField(_(u"Number")) is_active = models.BooleanField(_(u"Is active?")) reception_date = models.DateField(_(u'Reception date')) file_type = models.ForeignKey(FileType, verbose_name=_(u"File type")) general_contractor = models.ForeignKey(Organization, related_name='+', verbose_name=(u"General contractor")) last_modifier = models.ForeignKey(Person, related_name='+', verbose_name=(u"Last modifier")) towns = models.ManyToManyField("Town") if settings.COUNTRY == 'fr': ar_date = models.DateField(u"Date d'envoi du courrier \ avec accusé réception") ar_signed_by = models.ForeignKey(Person, related_name='+', verbose_name=u"Signature de l'accusé de réception par") history = HistoricalRecords() class Meta: verbose_name = _(u"Archaeological file") verbose_name_plural = _(u"Archaeological files") def __unicode__(self): return u"%d - %d" % (self.year, self.number) class OperationType(GeneralType): class Meta: verbose_name = _(u"Operation type") verbose_name_plural = _(u"Operation types") class Operation(models.Model): name = models.CharField(_(u"Name"), max_length=120) start_date = models.DateField(_(u"Start date")) end_date = models.DateField(_(u"End date")) in_charge = models.ForeignKey('Person', related_name='+', verbose_name=_(u"In charge")) operation_code = models.CharField(_(u"Operation code"), max_length=20) associated_file = models.ForeignKey(File, related_name='+', verbose_name=_(u"File")) operation_type = models.ForeignKey(OperationType, related_name='+', verbose_name=_(u"Operation type")) towns = models.ManyToManyField("Town") if settings.COUNTRY == 'fr': code_patriarche = models.IntegerField(u"Code PATRIARCHE") code_pat = models.CharField(u"Code PAT", max_length=10) code_dracar = models.CharField(u"Code DRACAR", max_length=10) class Meta: verbose_name = _(u"Operation") verbose_name_plural = _(u"Operations") def __unicode__(self): return self.name class Parcel(models.Model) : operation = models.ForeignKey(Operation, related_name='+', verbose_name=_(u"Operation")) 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 __unicode__(self): return u" - ".join([unicode(item) for item in \ [self.operation, self.section, self.parcel_number]]) class Period(GeneralType) : order = models.IntegerField(_(u"Order")) start_date = models.IntegerField(_(u"Start date")) end_date = models.IntegerField(_(u"End date")) parent = models.ForeignKey("Period", verbose_name=_(u"Parent period")) class Meta: verbose_name = _(u"Period") verbose_name_plural = _(u"Periods") def __unicode__(self): return self.label class DatingType(GeneralType): class Meta: verbose_name = _(u"Dating type") verbose_name_plural = _(u"Dating types") class DatingQuality(GeneralType): class Meta: verbose_name = _(u"Dating quality") verbose_name_plural = _(u"Dating qualities") class Dating(models.Model): period = models.ForeignKey(Period, verbose_name=_(u"Period")) start_date = models.IntegerField(_(u"Start date")) end_date = models.IntegerField(_(u"End date")) dating_type = models.ForeignKey(DatingType, verbose_name=_(u"Dating type")) quality = models.ForeignKey(DatingQuality, verbose_name=_(u"Quality")) class Meta: verbose_name = _(u"Dating") verbose_name_plural = _(u"Datings") class RegistrationUnit(models.Model): parcel = models.ForeignKey(Parcel, verbose_name=_(u"Parcel")) #operation = models.ForeignKey(Operation, verbose_name=_(u"Operation")) ???? label = models.CharField(_(u"Label"), max_length=200) description = models.TextField(_("Description")) lenght = models.IntegerField(_(u"Lenght")) width = models.IntegerField(_(u"Width")) thickness = models.IntegerField(_(u"Thickness")) depth = models.IntegerField(_(u"Depth")) has_furniture = models.BooleanField(u"Has furniture?") interpretation = models.TextField(_(u"Interpretation")) filling = models.TextField(_(u"Filling")) datings = models.ManyToManyField(Dating) # dans Item ??? class Meta: verbose_name = _(u"Registration Unit") verbose_name_plural = _(u"Registration Units") def __unicode__(self): return u"%s - %s" % (self.parcel, self.label) class SourceType(GeneralType): class Meta: verbose_name = _(u"Source type") verbose_name_plural = _(u"Source types") class Source(models.Model) : title = models.CharField(_(u"Title"), max_length=200) source_type = models.ForeignKey(SourceType, verbose_name=_(u"Type")) class Meta: verbose_name = _(u"Source") verbose_name_plural = _(u"Sources") def __unicode__(self): return self.title class MaterialType(GeneralType): recommendation = models.TextField(_(u"Recommendation")) class Meta: verbose_name = _(u"Material type") verbose_name_plural = _(u"Material types") class BaseItem(models.Model): label = models.CharField(_(u"Label"), max_length=60) description = models.TextField(_(u"Description")) registration_unit = models.ForeignKey(RegistrationUnit, verbose_name=_(u"Registration Unit")) is_isolated = models.BooleanField(_(u"Is isolated?")) documentations = models.ManyToManyField(Source) class Meta: verbose_name = _(u"Base item") verbose_name_plural = _(u"Base items") def __unicode__(self): return self.label class Item(models.Model): base_items = models.ManyToManyField(BaseItem, verbose_name=_(u"Base item")) order = models.IntegerField(_(u"Order")) label = models.CharField(_(u"Label"), max_length=60) description = models.TextField(_(u"Description")) material_type = models.ForeignKey(MaterialType, verbose_name = _(u"Material type")) volume = models.FloatField(_(u"Volume")) weight = models.IntegerField(_(u"Weight")) item_number = models.IntegerField(_("Item number")) upstream_treatment = models.ForeignKey("Treatment", related_name='downstream_treatment', verbose_name=_("Upstream treatment")) downstream_treatment = models.ForeignKey("Treatment", related_name='upstream_treatment', verbose_name=_("Downstream treatment")) dating = models.ForeignKey(Dating, verbose_name=_(u"Dating")) class Meta: verbose_name = _(u"Item") verbose_name_plural = _(u"Items") def __unicode__(self): return self.label class ParcelOwner(models.Model): 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 + u" - " + self.parcel class WarehouseType(GeneralType): class Meta: verbose_name = _(u"Warehouse type") verbose_name_plural = _(u"Warehouse types") class Warehouse(Address): name = models.CharField(_(u"Name"), max_length=40) warehouse_type = models.ForeignKey(WarehouseType, verbose_name=_(u"Warehouse type")) person_in_charge = models.ForeignKey(Person, verbose_name=_(u"Person in charge")) comment = models.TextField(_(u"Comment")) class Meta: verbose_name = _(u"Warehouse") verbose_name_plural = _(u"Warehouses") def __unicode__(self): return self.warehouse_type class ActType(GeneralType): class Meta: verbose_name = _(u"Act type") verbose_name_plural = _(u"Act types") class AdministrativeAct(models.Model): operation = models.ForeignKey(Operation, related_name='+', verbose_name=_(u"Operation")) signature_date = models.DateField(_(u"Signature date")) act_object = models.CharField(_(u"Object"), max_length=200) act_type = models.ForeignKey(ActType, verbose_name=_(u"Act type")) person = models.ForeignKey(Person, verbose_name=_(u"Person")) if settings.COUNTRY == 'fr': ref_sra = models.CharField(u"Référence SRA", max_length=15) class Meta: verbose_name = _(u"Administrative act") verbose_name_plural = _(u"Administrative acts") def __unicode__(self): return self.operation + u" - " + self.fact_object class ContainerType(GeneralType): lenght = models.IntegerField(_(u"Lenght")) width = models.IntegerField(_(u"Width")) height = models.IntegerField(_(u"Height")) volume = models.IntegerField(_(u"Volume")) reference = models.CharField(_(u"Reference"), max_length=15) class Meta: verbose_name = _(u"Container type") verbose_name_plural = _(u"Container types") class Container(models.Model): reference = models.CharField(_(u"Reference"), max_length=15) location = models.ForeignKey(Warehouse, verbose_name=_(u"Location")) container_type = models.ForeignKey(ContainerType, verbose_name=_("Container type")) comment = models.TextField(_(u"Comment")) class Meta: verbose_name = _(u"Container") verbose_name_plural = _(u"Containers") if settings.COUNTRY == 'fr': class Arrondissement(models.Model): name = models.CharField(u"Nom", max_length=30) department = models.ForeignKey(Departement, verbose_name=u"Département") def __unicode__(self): return self.name class Canton(models.Model): name = models.CharField(u"Nom", max_length=30) arrondissement = models.ForeignKey(Arrondissement, verbose_name=u"Arrondissement") def __unicode__(self): return self.name class Town(models.Model): name = models.CharField(_(u"Name"), max_length=100) surface = models.IntegerField(_(u"Surface")) center = models.PointField(_(u"Localisation"), srid=settings.SRID) if settings.COUNTRY == 'fr': numero_insee = models.CharField(u"Numéro INSEE", max_length=5) canton = models.ForeignKey(Canton, verbose_name=u"Canton") objects = models.GeoManager() class Meta: verbose_name = _(u"Town") verbose_name_plural = _(u"Towns") def __unicode__(self): return self.name class TreatmentType(GeneralType): class Meta: verbose_name = _(u"Treatment type") verbose_name_plural = _(u"Treatment types") class Treatment(models.Model): container = models.ForeignKey(Container, verbose_name=_(u"Container")) treatment_type = models.ForeignKey(TreatmentType, verbose_name=_(u"Treatment type")) location = models.ForeignKey(Warehouse, verbose_name=_(u"Location")) person = models.ForeignKey(Person, verbose_name=_(u'Person')) start_date = models.DateField(_(u"Start date")) end_date = models.DateField(_(u"End date")) class Meta: verbose_name = _(u"Treatment") verbose_name_plural = _(u"Treatments") def __unicode__(self): return self.item class AuthorType(GeneralType): class Meta: verbose_name = _(u"Author type") verbose_name_plural = _(u"Author types") class Author(models.Model): person = models.ForeignKey(Person, verbose_name=_(u"Person")) source = models.ForeignKey(Source, verbose_name=_(u"Source")) author_type = models.ForeignKey(AuthorType, verbose_name=_(u"Author type")) class Meta: verbose_name = _(u"Author") verbose_name_plural = _(u"Authors") def __unicode__(self): return self.person + u" - " + self.source class Property(models.Model): item = models.ForeignKey(Item, verbose_name=_(u"Item")) administrative_act = models.ForeignKey(AdministrativeAct, verbose_name=_(u"Administrative act")) person = models.ForeignKey(Person, verbose_name=_(u"Person")) start_date = models.DateField(_(u"Start date")) end_date = models.DateField(_(u"End date")) class Meta: verbose_name = _(u"Property") verbose_name_plural = _(u"Properties") def __unicode__(self): return self.person + u" - " + self.item