This repository has been archived on 2023-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
tabellio.documents/tabellio/documents/document.py

146 lines
6.1 KiB
Python

# -*- coding: utf-8 -*-
from five import grok
from zope import schema
from zope.interface import implements
from plone.directives import form, dexterity
from plone.dexterity.content import Item
from z3c.relationfield.schema import RelationChoice, RelationList
from plone.formwidget.contenttree import ObjPathSourceBinder
from z3c.relationfield.interfaces import IHasRelations
from plone.namedfile.field import NamedBlobFile
from themis.fields import LegisSession
from tabellio.documents.interfaces import MessageFactory as _
from tabellio.config.utils import get_documents_path
import typenames
from common import BasePublication
class IDocument(form.Schema):
title = schema.TextLine(title=_(u'Title'))
no = schema.TextLine(title=_('Number'), required=False)
session = LegisSession(title=_(u'Session'))
nodoc = schema.TextLine(title=_('Secondary Number'), required=False)
noannexe = schema.TextLine(title=_('Appendix Number'), required=False)
date = schema.Date(title=_(u'Date'))
authors = RelationList(title=_(u'Authors'), default=[], required=False,
value_type=RelationChoice(title=_(u'Author'),
source=ObjPathSourceBinder()))
topics = schema.Set(title=_(u'Topics'), required=False,
value_type=schema.TextLine(title=_(u'Topic')))
polgroups = RelationList(title=_(u'Political Groups'), default=[], required=False,
value_type=RelationChoice(title=_(u'Political Group'),
source=ObjPathSourceBinder()))
doctype = schema.TextLine(title=_('Document Type'))
file = NamedBlobFile(title=_('File'), required=False)
file_image_id = schema.TextLine(title=_('File Image Id'), required=False)
parent_dossier = RelationChoice(title=_(u'Parent File'), required=False,
source=ObjPathSourceBinder())
final_version = schema.Bool(title=_(u'Final Version'), required=False, default=False)
publication_date = schema.Date(title=_(u'Publication Date'), required=False)
adoption_date = schema.Date(title=_(u'Adoption Date'), required=False)
moniteur_date = schema.Date(title=_(u'Moniteur Date'), required=False)
# reserved for PFB
adopted = schema.Bool(title=_(u'Adopted'), required=False, default=False)
related_docs = RelationList(title=_(u'Related Documents'), default=[], required=False,
value_type=RelationChoice(title=_(u'Related Document'), source=ObjPathSourceBinder()))
sanction_date = schema.Date(title=_(u'Sanction Date'), required=False)
commission_status = schema.TextLine(title=_(u'Commission Status'), required=False)
seance_vote = schema.TextLine(title=_(u'Seance Vote'), required=False)
seance_vote_date = schema.Date(title=_(u'Seance Vote Date'), required=False)
author_is_government = schema.Bool(title=_(u'Author is Government'), default=False, required=False)
reporters = RelationList(title=_(u'Reporters'), default=[], required=False,
value_type=RelationChoice(title=_(u'Reporter'),
source=ObjPathSourceBinder()))
speakers = RelationList(title=_(u'Speakers'), default=[], required=False,
value_type=RelationChoice(title=_(u'Speaker'),
source=ObjPathSourceBinder()))
class Document(Item, BasePublication):
implements(IDocument, IHasRelations)
@property
def canonical_path(self):
return '/' + get_documents_path() + '/' + self.id
@property
def doctype_str(self):
if self.doctype is None: return _('Unknown')
return typenames.MAPPING.get(self.doctype, self.doctype)
@property
def refno(self):
if not self.no:
return '(%s)' % self.session
if self.nodoc:
if self.noannexe:
return u'%s (%s) - N° %s (Annexe %s)' % (
self.no, self.session, self.nodoc, self.noannexe)
else:
return u'%s (%s) - N° %s' % (self.no, self.session, self.nodoc)
else:
if self.noannexe:
return '%s (%s) (Annexe %s)' % (self.no, self.session, self.noannexe)
else:
return '%s (%s)' % (self.no, self.session)
@property
def reftitle(self):
if not self.no:
return '%s (%s)' % (self.doctype_str, self.session)
return u'%s - %s' % (self.doctype_str, self.refno)
@property
def associated_docs(self):
if not self.parent_dossier:
return []
docs = []
dossier = self.parent_dossier.to_object
if not dossier:
return None
doc_ids = [self.id]
for histoline in dossier.histolines:
if not histoline.document: continue
if histoline.document.to_object.getId() in doc_ids: continue
doc = histoline.document.to_object
docs.append(histoline.document.to_object)
doc_ids.append(histoline.document.to_object.getId())
return docs
def related_elements(self, max_items=5, closeness=0.5):
r = BasePublication.related_elements(self, max_items, closeness)
doc_ids = [x.id for x in (self.associated_docs or [])]
return [x for x in r if ((type(x.getId) is str) and x.getId or x.getId()) not in doc_ids]
@property
def publication_date_str(self):
return self.publication_date.strftime('%d/%m/%Y')
@property
def adoption_date_str(self):
return self.adoption_date.strftime('%d/%m/%Y')
@property
def moniteur_date_str(self):
return self.moniteur_date.strftime('%d/%m/%Y')
@property
def sanction_date_str(self):
return self.sanction_date.strftime('%d/%m/%Y')
@property
def seance_vote_date_str(self):
return self.seance_vote_date.strftime('%d/%m/%Y')
def get_authors_as_string(self):
if self.author_is_government:
return 'Gouvernement'
return BasePublication.get_authors_as_string(self)