Remove common app's Singleton model and use django-solo's SingletonModel instead

This commit is contained in:
Roberto Rosario
2014-07-10 01:26:51 -04:00
parent 1e56ea4dcb
commit 5212d84090
17 changed files with 314 additions and 51 deletions

View File

@@ -51,8 +51,8 @@ class BaseHolderSelectionForm(forms.Form):
class HolderSelectionForm(BaseHolderSelectionForm): class HolderSelectionForm(BaseHolderSelectionForm):
special_holders = [AnonymousUserSingleton.objects.get()] special_holders = [AnonymousUserSingleton.objects.get_or_create()[0]]
class ClassHolderSelectionForm(BaseHolderSelectionForm): class ClassHolderSelectionForm(BaseHolderSelectionForm):
special_holders = [AnonymousUserSingleton.objects.get(), CreatorSingleton.objects.get()] special_holders = [AnonymousUserSingleton.objects.get_or_create()[0], CreatorSingleton.objects.get_or_create()[0]]

View File

@@ -0,0 +1,89 @@
# -*- 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 'AccessEntry'
db.create_table(u'acls_accessentry', (
(u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('permission', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['permissions.StoredPermission'])),
('holder_type', self.gf('django.db.models.fields.related.ForeignKey')(related_name='access_holder', to=orm['contenttypes.ContentType'])),
('holder_id', self.gf('django.db.models.fields.PositiveIntegerField')()),
('content_type', self.gf('django.db.models.fields.related.ForeignKey')(related_name='object_content_type', to=orm['contenttypes.ContentType'])),
('object_id', self.gf('django.db.models.fields.PositiveIntegerField')()),
))
db.send_create_signal(u'acls', ['AccessEntry'])
# Adding model 'DefaultAccessEntry'
db.create_table(u'acls_defaultaccessentry', (
(u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('permission', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['permissions.StoredPermission'])),
('holder_type', self.gf('django.db.models.fields.related.ForeignKey')(related_name='default_access_entry_holder', to=orm['contenttypes.ContentType'])),
('holder_id', self.gf('django.db.models.fields.PositiveIntegerField')()),
('content_type', self.gf('django.db.models.fields.related.ForeignKey')(related_name='default_access_entry_class', to=orm['contenttypes.ContentType'])),
))
db.send_create_signal(u'acls', ['DefaultAccessEntry'])
# Adding model 'CreatorSingleton'
db.create_table(u'acls_creatorsingleton', (
(u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('lock_id', self.gf('django.db.models.fields.CharField')(default='1', unique=True, max_length=1)),
))
db.send_create_signal(u'acls', ['CreatorSingleton'])
def backwards(self, orm):
# Deleting model 'AccessEntry'
db.delete_table(u'acls_accessentry')
# Deleting model 'DefaultAccessEntry'
db.delete_table(u'acls_defaultaccessentry')
# Deleting model 'CreatorSingleton'
db.delete_table(u'acls_creatorsingleton')
models = {
u'acls.accessentry': {
'Meta': {'object_name': 'AccessEntry'},
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'object_content_type'", 'to': u"orm['contenttypes.ContentType']"}),
'holder_id': ('django.db.models.fields.PositiveIntegerField', [], {}),
'holder_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'access_holder'", 'to': u"orm['contenttypes.ContentType']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}),
'permission': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['permissions.StoredPermission']"})
},
u'acls.creatorsingleton': {
'Meta': {'object_name': 'CreatorSingleton'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'lock_id': ('django.db.models.fields.CharField', [], {'default': "'1'", 'unique': 'True', 'max_length': '1'})
},
u'acls.defaultaccessentry': {
'Meta': {'object_name': 'DefaultAccessEntry'},
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'default_access_entry_class'", 'to': u"orm['contenttypes.ContentType']"}),
'holder_id': ('django.db.models.fields.PositiveIntegerField', [], {}),
'holder_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'default_access_entry_holder'", 'to': u"orm['contenttypes.ContentType']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'permission': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['permissions.StoredPermission']"})
},
u'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
u'permissions.storedpermission': {
'Meta': {'ordering': "('namespace',)", 'unique_together': "(('namespace', 'name'),)", 'object_name': 'StoredPermission'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
'namespace': ('django.db.models.fields.CharField', [], {'max_length': '64'})
}
}
complete_apps = ['acls']

View File

@@ -0,0 +1,59 @@
# -*- 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):
# Deleting field 'CreatorSingleton.lock_id'
db.delete_column(u'acls_creatorsingleton', 'lock_id')
def backwards(self, orm):
# Adding field 'CreatorSingleton.lock_id'
db.add_column(u'acls_creatorsingleton', 'lock_id',
self.gf('django.db.models.fields.CharField')(default='1', max_length=1, unique=True),
keep_default=False)
models = {
u'acls.accessentry': {
'Meta': {'object_name': 'AccessEntry'},
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'object_content_type'", 'to': u"orm['contenttypes.ContentType']"}),
'holder_id': ('django.db.models.fields.PositiveIntegerField', [], {}),
'holder_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'access_holder'", 'to': u"orm['contenttypes.ContentType']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}),
'permission': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['permissions.StoredPermission']"})
},
u'acls.creatorsingleton': {
'Meta': {'object_name': 'CreatorSingleton'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
},
u'acls.defaultaccessentry': {
'Meta': {'object_name': 'DefaultAccessEntry'},
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'default_access_entry_class'", 'to': u"orm['contenttypes.ContentType']"}),
'holder_id': ('django.db.models.fields.PositiveIntegerField', [], {}),
'holder_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'default_access_entry_holder'", 'to': u"orm['contenttypes.ContentType']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'permission': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['permissions.StoredPermission']"})
},
u'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
u'permissions.storedpermission': {
'Meta': {'ordering': "('namespace',)", 'unique_together': "(('namespace', 'name'),)", 'object_name': 'StoredPermission'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
'namespace': ('django.db.models.fields.CharField', [], {'max_length': '64'})
}
}
complete_apps = ['acls']

View File

View File

@@ -8,8 +8,9 @@ from django.utils.translation import ugettext
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic from django.contrib.contenttypes import generic
from solo.models import SingletonModel
from permissions.models import StoredPermission from permissions.models import StoredPermission
from common.models import Singleton, SingletonManager
from .managers import AccessEntryManager, DefaultAccessEntryManager from .managers import AccessEntryManager, DefaultAccessEntryManager
from .classes import AccessObjectClass from .classes import AccessObjectClass
@@ -92,7 +93,7 @@ class DefaultAccessEntry(models.Model):
return u'%s: %s' % (self.content_type, self.content_object) return u'%s: %s' % (self.content_type, self.content_object)
class CreatorSingletonManager(SingletonManager): class CreatorSingletonManager(models.Manager):
def passthru_check(self, holder, creator=None): def passthru_check(self, holder, creator=None):
if isinstance(holder, self.model): if isinstance(holder, self.model):
# TODO: raise explicit error if is instance and creator=None # TODO: raise explicit error if is instance and creator=None
@@ -101,7 +102,7 @@ class CreatorSingletonManager(SingletonManager):
return holder return holder
class CreatorSingleton(Singleton): class CreatorSingleton(SingletonModel):
objects = CreatorSingletonManager() objects = CreatorSingletonManager()
def __unicode__(self): def __unicode__(self):

View File

@@ -17,7 +17,7 @@ from navigation.api import register_links, register_top_menu
from .conf import settings as common_settings from .conf import settings as common_settings
from .conf.settings import (AUTO_CREATE_ADMIN, AUTO_ADMIN_USERNAME, from .conf.settings import (AUTO_CREATE_ADMIN, AUTO_ADMIN_USERNAME,
AUTO_ADMIN_PASSWORD, TEMPORARY_DIRECTORY) AUTO_ADMIN_PASSWORD, TEMPORARY_DIRECTORY)
from .models import AutoAdminSingleton from .models import AnonymousUserSingleton, AutoAdminSingleton
from .utils import validate_path from .utils import validate_path
@@ -61,7 +61,7 @@ def create_superuser(sender, **kwargs):
assert auth_models.User.objects.create_superuser(AUTO_ADMIN_USERNAME, 'autoadmin@autoadmin.com', AUTO_ADMIN_PASSWORD) assert auth_models.User.objects.create_superuser(AUTO_ADMIN_USERNAME, 'autoadmin@autoadmin.com', AUTO_ADMIN_PASSWORD)
admin = auth_models.User.objects.get(username=AUTO_ADMIN_USERNAME) admin = auth_models.User.objects.get(username=AUTO_ADMIN_USERNAME)
# Store the auto admin password properties to display the first login message # Store the auto admin password properties to display the first login message
auto_admin_properties = AutoAdminSingleton.objects.get() auto_admin_properties, created = AutoAdminSingleton.objects.get_or_create()
auto_admin_properties.account = admin auto_admin_properties.account = admin
auto_admin_properties.password = AUTO_ADMIN_PASSWORD auto_admin_properties.password = AUTO_ADMIN_PASSWORD
auto_admin_properties.password_hash = admin.password auto_admin_properties.password_hash = admin.password
@@ -74,7 +74,7 @@ def create_superuser(sender, **kwargs):
def auto_admin_account_passwd_change(sender, instance, **kwargs): def auto_admin_account_passwd_change(sender, instance, **kwargs):
try: try:
with transaction.atomic(): with transaction.atomic():
auto_admin_properties = AutoAdminSingleton.objects.get() auto_admin_properties, created = AutoAdminSingleton.objects.get_or_create()
if instance == auto_admin_properties.account and instance.password != auto_admin_properties.password_hash: if instance == auto_admin_properties.account and instance.password != auto_admin_properties.password_hash:
# Only delete the auto admin properties when the password has been changed # Only delete the auto admin properties when the password has been changed
auto_admin_properties.delete(force=True) auto_admin_properties.delete(force=True)

View File

@@ -0,0 +1,80 @@
# -*- 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):
# Deleting field 'AutoAdminSingleton.lock_id'
db.delete_column(u'common_autoadminsingleton', 'lock_id')
# Deleting field 'AnonymousUserSingleton.lock_id'
db.delete_column(u'common_anonymoususersingleton', 'lock_id')
def backwards(self, orm):
# Adding field 'AutoAdminSingleton.lock_id'
db.add_column(u'common_autoadminsingleton', 'lock_id',
self.gf('django.db.models.fields.CharField')(default=1, max_length=1, unique=True),
keep_default=False)
# Adding field 'AnonymousUserSingleton.lock_id'
db.add_column(u'common_anonymoususersingleton', 'lock_id',
self.gf('django.db.models.fields.CharField')(default=1, max_length=1, unique=True),
keep_default=False)
models = {
u'auth.group': {
'Meta': {'object_name': 'Group'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
},
u'auth.permission': {
'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
},
u'auth.user': {
'Meta': {'object_name': 'User'},
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}),
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
},
u'common.anonymoususersingleton': {
'Meta': {'object_name': 'AnonymousUserSingleton'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
},
u'common.autoadminsingleton': {
'Meta': {'object_name': 'AutoAdminSingleton'},
'account': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'auto_admin_account'", 'null': 'True', 'to': u"orm['auth.User']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}),
'password_hash': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'})
},
u'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
}
}
complete_apps = ['common']

View File

@@ -4,43 +4,10 @@ from django.utils.translation import ugettext
from django.contrib.auth.models import AnonymousUser from django.contrib.auth.models import AnonymousUser
from django.contrib.auth.models import User from django.contrib.auth.models import User
SINGLETON_LOCK_ID = 1 from solo.models import SingletonModel
class SingletonManager(models.Manager): class AnonymousUserSingleton(SingletonModel):
def get(self, **kwargs):
instance, created = self.model.objects.get_or_create(lock_id=SINGLETON_LOCK_ID, **kwargs)
return instance
class Singleton(models.Model):
lock_id = models.CharField(max_length=1, default=SINGLETON_LOCK_ID, editable=False, verbose_name=_(u'lock field'), unique=True)
objects = SingletonManager()
def save(self, *args, **kwargs):
self.id = 1
super(Singleton, self).save(*args, **kwargs)
def delete(self, force=False, *args, **kwargs):
if force:
return super(Singleton, self).delete(*args, **kwargs)
class Meta:
abstract = True
class AnonymousUserSingletonManager(SingletonManager):
def passthru_check(self, user):
if isinstance(user, AnonymousUser):
return self.model.objects.get()
else:
return user
class AnonymousUserSingleton(Singleton):
objects = AnonymousUserSingletonManager()
def __unicode__(self): def __unicode__(self):
return ugettext('Anonymous user') return ugettext('Anonymous user')
@@ -49,7 +16,7 @@ class AnonymousUserSingleton(Singleton):
verbose_name_plural = _(u'anonymous user') verbose_name_plural = _(u'anonymous user')
class AutoAdminSingleton(Singleton): class AutoAdminSingleton(SingletonModel):
account = models.ForeignKey(User, null=True, blank=True, related_name='auto_admin_account', verbose_name=_(u'account')) account = models.ForeignKey(User, null=True, blank=True, related_name='auto_admin_account', verbose_name=_(u'account'))
password = models.CharField(null=True, blank=True, verbose_name=_(u'password'), max_length=128) password = models.CharField(null=True, blank=True, verbose_name=_(u'password'), max_length=128)
password_hash = models.CharField(null=True, blank=True, verbose_name=_(u'password hash'), max_length=128) password_hash = models.CharField(null=True, blank=True, verbose_name=_(u'password hash'), max_length=128)

View File

@@ -19,7 +19,7 @@ from .models import Installation
@receiver(post_migrate, dispatch_uid='trigger_first_time') @receiver(post_migrate, dispatch_uid='trigger_first_time')
def trigger_first_time(sender, **kwargs): def trigger_first_time(sender, **kwargs):
if kwargs['app'] == 'installation': if kwargs['app'] == 'installation':
details = Installation.objects.get() details, created = Installation.objects.get_or_create()
details.is_first_run = True details.is_first_run = True
details.save() details.save()
@@ -27,7 +27,7 @@ def trigger_first_time(sender, **kwargs):
def check_first_run(): def check_first_run():
try: try:
with transaction.atomic(): with transaction.atomic():
details = Installation.objects.get() details, created = Installation.objects.get_or_create()
except DatabaseError: except DatabaseError:
# Avoid database errors when the app tables haven't been created yet # Avoid database errors when the app tables haven't been created yet
pass pass

View File

@@ -0,0 +1,31 @@
# -*- 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):
# Deleting field 'Installation.lock_id'
db.delete_column(u'installation_installation', 'lock_id')
def backwards(self, orm):
# Adding field 'Installation.lock_id'
db.add_column(u'installation_installation', 'lock_id',
self.gf('django.db.models.fields.CharField')(default=1, max_length=1, unique=True),
keep_default=False)
models = {
u'installation.installation': {
'Meta': {'object_name': 'Installation'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_first_run': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'uuid': ('django.db.models.fields.CharField', [], {'default': "u'745d2184-d011-4a19-a3d9-df3bab80f82c'", 'max_length': '48', 'blank': 'True'})
}
}
complete_apps = ['installation']

View File

@@ -24,7 +24,8 @@ from django.utils.translation import ugettext_lazy as _
from django.utils.datastructures import SortedDict from django.utils.datastructures import SortedDict
from django.conf import settings from django.conf import settings
from common.models import Singleton from solo.models import SingletonModel
from common.utils import pretty_size from common.utils import pretty_size
from mayan import __version__ as mayan_version from mayan import __version__ as mayan_version
from lock_manager import Lock, LockError from lock_manager import Lock, LockError
@@ -35,7 +36,7 @@ from .literals import (FORM_SUBMIT_URL, FORM_KEY, FORM_RECEIVER_FIELD,
TIMEOUT, FABFILE_MARKER) TIMEOUT, FABFILE_MARKER)
class Installation(Singleton): class Installation(SingletonModel):
_properties = SortedDict() _properties = SortedDict()
is_first_run = models.BooleanField(default=False) is_first_run = models.BooleanField(default=False)

View File

@@ -20,6 +20,6 @@ register_links(['form_view', 'about_view', 'license_view'], [form_view], menu_na
try: try:
with transaction.atomic(): with transaction.atomic():
RegistrationSingleton.objects.get() RegistrationSingleton.objects.get_or_create()
except DatabaseError: except DatabaseError:
pass pass

View File

@@ -0,0 +1,31 @@
# -*- 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):
# Deleting field 'RegistrationSingleton.lock_id'
db.delete_column(u'registration_registrationsingleton', 'lock_id')
def backwards(self, orm):
# Adding field 'RegistrationSingleton.lock_id'
db.add_column(u'registration_registrationsingleton', 'lock_id',
self.gf('django.db.models.fields.CharField')(default=1, max_length=1, unique=True),
keep_default=False)
models = {
u'registration.registrationsingleton': {
'Meta': {'object_name': 'RegistrationSingleton'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'registered': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'registration_data': ('django.db.models.fields.TextField', [], {'blank': 'True'})
}
}
complete_apps = ['registration']

View File

@@ -6,14 +6,15 @@ import requests
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from common.models import Singleton from solo.models import SingletonModel
from lock_manager import Lock, LockError from lock_manager import Lock, LockError
from .literals import FORM_SUBMIT_URL, FORM_KEY, FORM_RECEIVER_FIELD, TIMEOUT from .literals import FORM_SUBMIT_URL, FORM_KEY, FORM_RECEIVER_FIELD, TIMEOUT
from .exceptions import AlreadyRegistered from .exceptions import AlreadyRegistered
class RegistrationSingleton(Singleton): class RegistrationSingleton(SingletonModel):
_cached_name = None _cached_name = None
_registered = None _registered = None

View File

@@ -52,6 +52,7 @@ INSTALLED_APPS = (
'mptt', 'mptt',
'compressor', 'compressor',
'rest_framework', 'rest_framework',
'solo',
# Base generic # Base generic
'permissions', 'permissions',
'project_setup', 'project_setup',

View File

@@ -10,6 +10,7 @@ django-taggit==0.12
django-mptt==0.6.1 django-mptt==0.6.1
django-rest-swagger==0.1.14 django-rest-swagger==0.1.14
django-sendfile==0.3.6 django-sendfile==0.3.6
django-solo==1.0.5
djangorestframework==2.3.14 djangorestframework==2.3.14
GitPython==0.3.2.RC1 GitPython==0.3.2.RC1

View File

@@ -62,6 +62,7 @@ django-taggit==0.12
django-mptt==0.6.1 django-mptt==0.6.1
django-rest-swagger==0.1.14 django-rest-swagger==0.1.14
django-sendfile==0.3.6 django-sendfile==0.3.6
django-solo==1.0.5
djangorestframework==2.3.14 djangorestframework==2.3.14
GitPython==0.3.2.RC1 GitPython==0.3.2.RC1
ghostscript==0.4.1 ghostscript==0.4.1