diff --git a/mayan/apps/states/__init__.py b/mayan/apps/states/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/mayan/apps/states/admin.py b/mayan/apps/states/admin.py new file mode 100644 index 0000000000..d09f4c59ac --- /dev/null +++ b/mayan/apps/states/admin.py @@ -0,0 +1,14 @@ +from django.contrib import admin +from django.utils.translation import ugettext_lazy as _ + +from django.contrib.admin.widgets import FilteredSelectMultiple + + +from .models import (DocumentStateLog, State, StateTransition, + DocumentTypeStateCollection) + + +admin.site.register(DocumentStateLog) +admin.site.register(DocumentTypeStateCollection) +admin.site.register(State) +admin.site.register(StateTransition) diff --git a/mayan/apps/states/models.py b/mayan/apps/states/models.py new file mode 100644 index 0000000000..bfe02dd556 --- /dev/null +++ b/mayan/apps/states/models.py @@ -0,0 +1,59 @@ +from __future__ import absolute_import + +from django.db import models +from django.utils.translation import ugettext +from django.utils.translation import ugettext_lazy as _ + +from documents.models import Document, DocumentType + + +class DocumentTypeStateCollection(models.Model): + document_type = models.ForeignKey(DocumentType, related_name='state_collections', verbose_name=_('Document type')) + label = models.CharField(max_length=128, verbose_name=_('Label')) + + class Meta: + verbose_name = _('Document type state collection') + verbose_name_plural = _('Document type state collections') + + def __unicode__(self): + return self.label + + +class State(models.Model): + document_type_state_collection = models.ForeignKey(DocumentTypeStateCollection, related_name='states', verbose_name=_('Document type state collection')) + label = models.CharField(max_length=128, verbose_name=_('Label')) + initial = models.BooleanField(default=False, verbose_name=_('Initial')) + + class Meta: + verbose_name = _('State template') + verbose_name_plural = _('State templates') + + def __unicode__(self): + return self.label + + +class StateTransition(models.Model): + source_state_template = models.ForeignKey(State, related_name='transitions', verbose_name=_('Source state')) + destination_state_template = models.ForeignKey(State, verbose_name=_('Destination state')) + + class Meta: + verbose_name = _('State transition') + verbose_name_plural = _('State transitions') + + def __unicode__(self): + return u'{} => {}'.format(self.source_state_template, self.destination_state_template) + + +class DocumentStateLog(models.Model): + datetime = models.DateTimeField(auto_now_add=True, verbose_name=_('Date time')) + document = models.ForeignKey(Document, related_name='states_log', verbose_name=_('Document')) + document_type_state_collection = models.ForeignKey(DocumentTypeStateCollection, verbose_name=_('Document type state collection')) + state = models.ForeignKey(State, verbose_name=_('State')) + + class Meta: + unique_together = ('document', 'document_type_state_collection') + verbose_name = _('Document state log') + verbose_name_plural = _(u'Document state logs') + + def __unicode__(self): + return self.state diff --git a/mayan/apps/states/south_migrations/0001_initial.py b/mayan/apps/states/south_migrations/0001_initial.py new file mode 100644 index 0000000000..af7bb6b0c6 --- /dev/null +++ b/mayan/apps/states/south_migrations/0001_initial.py @@ -0,0 +1,110 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding model 'DocumentTypeStateCollection' + db.create_table(u'states_documenttypestatecollection', ( + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('document_type', self.gf('django.db.models.fields.related.ForeignKey')(related_name='state_collections', to=orm['documents.DocumentType'])), + ('label', self.gf('django.db.models.fields.CharField')(max_length=128)), + )) + db.send_create_signal(u'states', ['DocumentTypeStateCollection']) + + # Adding model 'State' + db.create_table(u'states_state', ( + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('document_type_state_collection', self.gf('django.db.models.fields.related.ForeignKey')(related_name='states', to=orm['states.DocumentTypeStateCollection'])), + ('label', self.gf('django.db.models.fields.CharField')(max_length=128)), + ('initial', self.gf('django.db.models.fields.BooleanField')(default=False)), + )) + db.send_create_signal(u'states', ['State']) + + # Adding model 'StateTransition' + db.create_table(u'states_statetransition', ( + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('source_state_template', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['states.State'])), + ('destination_state_template', self.gf('django.db.models.fields.related.ForeignKey')(related_name='transitions', to=orm['states.State'])), + )) + db.send_create_signal(u'states', ['StateTransition']) + + # Adding model 'DocumentStateLog' + db.create_table(u'states_documentstatelog', ( + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('datetime', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)), + ('document', self.gf('django.db.models.fields.related.ForeignKey')(related_name='states_log', to=orm['documents.Document'])), + ('document_type_state_collection', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['states.DocumentTypeStateCollection'])), + ('state', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['states.State'])), + )) + db.send_create_signal(u'states', ['DocumentStateLog']) + + # Adding unique constraint on 'DocumentStateLog', fields ['document', 'document_type_state_collection'] + db.create_unique(u'states_documentstatelog', ['document_id', 'document_type_state_collection_id']) + + + def backwards(self, orm): + # Removing unique constraint on 'DocumentStateLog', fields ['document', 'document_type_state_collection'] + db.delete_unique(u'states_documentstatelog', ['document_id', 'document_type_state_collection_id']) + + # Deleting model 'DocumentTypeStateCollection' + db.delete_table(u'states_documenttypestatecollection') + + # Deleting model 'State' + db.delete_table(u'states_state') + + # Deleting model 'StateTransition' + db.delete_table(u'states_statetransition') + + # Deleting model 'DocumentStateLog' + db.delete_table(u'states_documentstatelog') + + + models = { + u'documents.document': { + 'Meta': {'ordering': "['-date_added']", 'object_name': 'Document'}, + 'date_added': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'document_type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'documents'", 'null': 'True', 'to': u"orm['documents.DocumentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'uuid': ('django.db.models.fields.CharField', [], {'max_length': '48', 'blank': 'True'}) + }, + u'documents.documenttype': { + 'Meta': {'ordering': "['name']", 'object_name': 'DocumentType'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '32'}) + }, + u'states.documentstatelog': { + 'Meta': {'unique_together': "(('document', 'document_type_state_collection'),)", 'object_name': 'DocumentStateLog'}, + 'datetime': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'document': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'states_log'", 'to': u"orm['documents.Document']"}), + 'document_type_state_collection': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['states.DocumentTypeStateCollection']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'state': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['states.State']"}) + }, + u'states.documenttypestatecollection': { + 'Meta': {'object_name': 'DocumentTypeStateCollection'}, + 'document_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'state_collections'", 'to': u"orm['documents.DocumentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'label': ('django.db.models.fields.CharField', [], {'max_length': '128'}) + }, + u'states.state': { + 'Meta': {'object_name': 'State'}, + 'document_type_state_collection': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'states'", 'to': u"orm['states.DocumentTypeStateCollection']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'initial': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'label': ('django.db.models.fields.CharField', [], {'max_length': '128'}) + }, + u'states.statetransition': { + 'Meta': {'object_name': 'StateTransition'}, + 'destination_state_template': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'transitions'", 'to': u"orm['states.State']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'source_state_template': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['states.State']"}) + } + } + + complete_apps = ['states'] \ No newline at end of file diff --git a/mayan/apps/states/south_migrations/__init__.py b/mayan/apps/states/south_migrations/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/mayan/apps/states/urls.py b/mayan/apps/states/urls.py new file mode 100644 index 0000000000..0b2cafa095 --- /dev/null +++ b/mayan/apps/states/urls.py @@ -0,0 +1,22 @@ +from django.conf.urls import patterns, url + + +urlpatterns = patterns('states.views', + # Setup views + + url(r'^setup/document_type/(?P\d+)/collections/$', 'setup_source_list', name='document_type_collection_list'), + + #url(r'^setup/interactive/(?P\w+)/list/$', 'setup_source_list', (), 'setup_source_list'), + #url(r'^setup/interactive/(?P\d+)/edit/$', 'setup_source_edit', (), 'setup_source_edit'), + #url(r'^setup/interactive/(?P\d+)/delete/$', 'setup_source_delete', (), 'setup_source_delete'), + #url(r'^setup/interactive/(?P\w+)/create/$', 'setup_source_create', (), 'setup_source_create'), + #url(r'^setup/interactive/(?P\d+)/transformation/list/$', 'setup_source_transformation_list', (), 'setup_source_transformation_list'), + #url(r'^setup/interactive/(?P\d+)/transformation/create/$', 'setup_source_transformation_create', (), 'setup_source_transformation_create'), + #url(r'^setup/interactive/source/transformation/(?P\d+)/edit/$', 'setup_source_transformation_edit', (), 'setup_source_transformation_edit'), + #url(r'^setup/interactive/source/transformation/(?P\d+)/delete/$', 'setup_source_transformation_delete', (), 'setup_source_transformation_delete'), + + # Document create views + + #url(r'^create/from/local/multiple/$', DocumentCreateWizard.as_view(), name='document_create_multiple'), + #url(r'^(?P\d+)/create/siblings/$', 'document_create_siblings', (), 'document_create_siblings'), +) diff --git a/mayan/apps/states/views.py b/mayan/apps/states/views.py new file mode 100644 index 0000000000..a217f58a75 --- /dev/null +++ b/mayan/apps/states/views.py @@ -0,0 +1,16 @@ +from django.conf import settings +from django.contrib import messages +from django.core.exceptions import PermissionDenied +from django.core.urlresolvers import reverse +from django.http import HttpResponseRedirect +from django.shortcuts import render_to_response, get_object_or_404 +from django.template import RequestContext +from django.utils.http import urlencode +from django.utils.safestring import mark_safe +from django.utils.translation import ugettext +from django.utils.translation import ugettext_lazy as _ + +from acls.models import AccessEntry +from common.utils import encapsulate +from documents.models import DocumentType, Document +from permissions.models import Permission