pax_global_header 0000666 0000000 0000000 00000000064 12304627050 0014511 g ustar 00root root 0000000 0000000 52 comment=f6687581d925e645d32e2c2ba44199aee7980120 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/ 0000775 0000000 0000000 00000000000 12304627050 0024515 5 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/.gitignore 0000664 0000000 0000000 00000000325 12304627050 0026505 0 ustar 00root root 0000000 0000000 # Python bytecode: *.py[co] # Packaging files: *.egg* # Editor temp files: *.swp *~ # Sphinx docs: build _build # SQLite3 database files: *.db # Logs: *.log .ropeproject celerybeat-schedule .coverage *,cover CONTRIBUTORS.txt 0000664 0000000 0000000 00000000141 12304627050 0027130 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120 Adam Dudas Bence Danyi Daniel Bach Gergo Nagy Imre Szeberenyi Mate Ory Sandor Guba Viktor Kalman cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/LICENSE.txt 0000664 0000000 0000000 00000000206 12304627050 0026336 0 ustar 00root root 0000000 0000000 Copyright (c) 2012--2013 Budapest University of Technology and Economics (BME-IK), and contributors. [SOME OPEN SOURCE LICENSE HERE] cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/README.rst 0000664 0000000 0000000 00000000163 12304627050 0026204 0 ustar 00root root 0000000 0000000 ============= cirecle-cloud ============= This is the Django based controller and web portal of the CIRCLE Cloud. cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/ 0000775 0000000 0000000 00000000000 12304627050 0025756 5 ustar 00root root 0000000 0000000 __init__.py 0000664 0000000 0000000 00000000000 12304627050 0027776 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/acl/ 0000775 0000000 0000000 00000000000 12304627050 0026515 5 ustar 00root root 0000000 0000000 __init__.py 0000664 0000000 0000000 00000000000 12304627050 0030535 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/acl management/ 0000775 0000000 0000000 00000000000 12304627050 0030552 5 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/acl __init__.py 0000664 0000000 0000000 00000005315 12304627050 0032667 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/acl/management """ Creates Levels for all installed apps that have levels. """ from django.db.models import get_models, signals from django.db import DEFAULT_DB_ALIAS from django.core.exceptions import ImproperlyConfigured from ..models import Level, AclBase def create_levels(app, created_models, verbosity, db=DEFAULT_DB_ALIAS, **kwargs): """Create and set the weights of the configured Levels. Based on django.contrib.auth.management.__init__.create_permissions""" # if not router.allow_migrate(db, auth_app.Permission): # return from django.contrib.contenttypes.models import ContentType app_models = [k for k in get_models(app) if AclBase in k.__bases__] print "Creating levels for models: %s." % ", ".join( [m.__name__ for m in app_models]) # This will hold the levels we're looking for as # (content_type, (codename, name)) searched_levels = list() level_weights = list() # The codenames and ctypes that should exist. ctypes = set() for klass in app_models: # Force looking up the content types in the current database # before creating foreign keys to them. ctype = ContentType.objects.db_manager(db).get_for_model(klass) ctypes.add(ctype) weight = 0 try: for codename, name in klass.ACL_LEVELS: searched_levels.append((ctype, (codename, name))) level_weights.append((ctype, codename, weight)) weight += 1 except AttributeError: raise ImproperlyConfigured( "Class %s doesn't have ACL_LEVELS attribute." % klass) # Find all the Levels that have a content_type for a model we're # looking for. We don't need to check for codenames since we already have # a list of the ones we're going to create. all_levels = set(Level.objects.using(db).filter( content_type__in=ctypes, ).values_list( "content_type", "codename" )) levels = [ Level(codename=codename, name=name, content_type=ctype) for ctype, (codename, name) in searched_levels if (ctype.pk, codename) not in all_levels ] Level.objects.using(db).bulk_create(levels) if verbosity >= 2: print("Adding levels [%s]." % ", ".join(levels)) print("Searched: [%s]." % ", ".join( [unicode(l) for l in searched_levels])) print("All: [%s]." % ", ".join([unicode(l) for l in all_levels])) # set weights for ctype, codename, weight in level_weights: Level.objects.filter(codename=codename, content_type=ctype).update(weight=weight) signals.post_syncdb.connect( create_levels, dispatch_uid="circle.acl.management.create_levels") commands/ 0000775 0000000 0000000 00000000000 12304627050 0032353 5 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/acl/management __init__.py 0000664 0000000 0000000 00000000000 12304627050 0034452 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/acl/management/commands update_levels.py 0000664 0000000 0000000 00000000353 12304627050 0035562 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/acl/management/commands from django.core.management.base import BaseCommand from .. import create_levels class Command(BaseCommand): args = '' help = 'Regenerates Levels' def handle(self, *args, **options): create_levels(None, None, 3) migrations/ 0000775 0000000 0000000 00000000000 12304627050 0030612 5 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/acl 0001_initial.py 0000664 0000000 0000000 00000017615 12304627050 0033267 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/acl/migrations # -*- coding: utf-8 -*- import 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 'Level' db.create_table(u'acl_level', ( (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), ('name', self.gf('django.db.models.fields.CharField')(max_length=50)), ('content_type', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['contenttypes.ContentType'])), ('codename', self.gf('django.db.models.fields.CharField')(max_length=100)), ('weight', self.gf('django.db.models.fields.IntegerField')(null=True)), )) db.send_create_signal(u'acl', ['Level']) # Adding unique constraint on 'Level', fields ['content_type', 'codename'] db.create_unique(u'acl_level', ['content_type_id', 'codename']) # Adding model 'ObjectLevel' db.create_table(u'acl_objectlevel', ( (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), ('level', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['acl.Level'])), ('content_type', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['contenttypes.ContentType'])), ('object_id', self.gf('django.db.models.fields.CharField')(max_length=255)), )) db.send_create_signal(u'acl', ['ObjectLevel']) # Adding unique constraint on 'ObjectLevel', fields ['content_type', 'object_id', 'level'] db.create_unique(u'acl_objectlevel', ['content_type_id', 'object_id', 'level_id']) # Adding M2M table for field users on 'ObjectLevel' m2m_table_name = db.shorten_name(u'acl_objectlevel_users') db.create_table(m2m_table_name, ( ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), ('objectlevel', models.ForeignKey(orm[u'acl.objectlevel'], null=False)), ('user', models.ForeignKey(orm[u'auth.user'], null=False)) )) db.create_unique(m2m_table_name, ['objectlevel_id', 'user_id']) # Adding M2M table for field groups on 'ObjectLevel' m2m_table_name = db.shorten_name(u'acl_objectlevel_groups') db.create_table(m2m_table_name, ( ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), ('objectlevel', models.ForeignKey(orm[u'acl.objectlevel'], null=False)), ('group', models.ForeignKey(orm[u'auth.group'], null=False)) )) db.create_unique(m2m_table_name, ['objectlevel_id', 'group_id']) def backwards(self, orm): # Removing unique constraint on 'ObjectLevel', fields ['content_type', 'object_id', 'level'] db.delete_unique(u'acl_objectlevel', ['content_type_id', 'object_id', 'level_id']) # Removing unique constraint on 'Level', fields ['content_type', 'codename'] db.delete_unique(u'acl_level', ['content_type_id', 'codename']) # Deleting model 'Level' db.delete_table(u'acl_level') # Deleting model 'ObjectLevel' db.delete_table(u'acl_objectlevel') # Removing M2M table for field users on 'ObjectLevel' db.delete_table(db.shorten_name(u'acl_objectlevel_users')) # Removing M2M table for field groups on 'ObjectLevel' db.delete_table(db.shorten_name(u'acl_objectlevel_groups')) models = { u'acl.level': { 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Level'}, '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'}), 'weight': ('django.db.models.fields.IntegerField', [], {'null': 'True'}) }, u'acl.objectlevel': { 'Meta': {'unique_together': "(('content_type', 'object_id', 'level'),)", 'object_name': 'ObjectLevel'}, 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'level': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['acl.Level']"}), 'object_id': ('django.db.models.fields.CharField', [], {'max_length': '255'}), 'users': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.User']", 'symmetrical': 'False'}) }, 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', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), 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', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) }, 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 = ['acl'] 0002_auto__chg_field_objectlevel_object_id.py 0000664 0000000 0000000 00000012413 12304627050 0041301 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/acl/migrations # -*- coding: utf-8 -*- import datetime from south.db import db from south.v2 import SchemaMigration from django.db import models class Migration(SchemaMigration): def forwards(self, orm): # Changing field 'ObjectLevel.object_id' # db.alter_column(u'acl_objectlevel', 'object_id', self.gf('django.db.models.fields.IntegerField')()) db.execute('''ALTER TABLE "acl_objectlevel" ALTER COLUMN "object_id" SET NOT NULL, ALTER COLUMN "object_id" DROP DEFAULT, ALTER COLUMN "object_id" TYPE integer USING ("object_id"::integer);''') def backwards(self, orm): # Changing field 'ObjectLevel.object_id' db.alter_column(u'acl_objectlevel', 'object_id', self.gf('django.db.models.fields.CharField')(max_length=255)) models = { u'acl.level': { 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Level'}, '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'}), 'weight': ('django.db.models.fields.IntegerField', [], {'null': 'True'}) }, u'acl.objectlevel': { 'Meta': {'unique_together': "(('content_type', 'object_id', 'level'),)", 'object_name': 'ObjectLevel'}, 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'level': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['acl.Level']"}), 'object_id': ('django.db.models.fields.IntegerField', [], {}), 'users': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.User']", 'symmetrical': 'False'}) }, 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', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), 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', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) }, 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 = ['acl'] __init__.py 0000664 0000000 0000000 00000000000 12304627050 0032711 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/acl/migrations models.py 0000664 0000000 0000000 00000020002 12304627050 0030265 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/acl import logging from django.contrib.auth.models import User, Group from django.contrib.contenttypes.generic import ( GenericForeignKey, GenericRelation ) from django.contrib.contenttypes.models import ContentType from django.db.models import ( ManyToManyField, ForeignKey, CharField, Model, IntegerField, Q ) logger = logging.getLogger(__name__) class Level(Model): """Definition of a permission level. Instances are automatically populated based on AclBase.""" name = CharField('name', max_length=50) content_type = ForeignKey(ContentType) codename = CharField('codename', max_length=100) weight = IntegerField('weight', null=True) def __unicode__(self): return "<%s/%s>" % (unicode(self.content_type), self.name) class Meta: unique_together = (('content_type', 'codename'), # ('content_type', 'weight'), # TODO find a way of temp. disabling this constr. ) class ObjectLevel(Model): """Permission level for a specific object.""" level = ForeignKey(Level) content_type = ForeignKey(ContentType) object_id = IntegerField() content_object = GenericForeignKey() users = ManyToManyField(User) groups = ManyToManyField(Group) def __unicode__(self): return "<%s: %s>" % (unicode(self.content_object), unicode(self.level)) class Meta: unique_together = (('content_type', 'object_id', 'level'),) class AclBase(Model): """Define permission levels for Users/Groups per object.""" object_level_set = GenericRelation(ObjectLevel) @classmethod def get_level_object(cls, level): """Get Level object for this model by codename.""" ct = ContentType.objects.get_for_model(cls) return Level.objects.get(codename=level, content_type=ct) def set_level(self, whom, level): """Set level of object for a user or group. :param whom: user or group the level is set for :type whom: User or Group :param level: codename of level to set, or None :type level: Level or str or unicode or NoneType """ if isinstance(whom, User): self.set_user_level(whom, level) elif isinstance(whom, Group): self.set_group_level(whom, level) else: raise AttributeError('"whom" must be a User or Group object.') def set_user_level(self, user, level): """Set level of object for a user. :param whom: user the level is set for :type whom: User :param level: codename of level to set, or None :type level: Level or str or unicode or NoneType """ logger.info('%s.set_user_level(%s, %s) called', *[unicode(p) for p in [self, user, level]]) if level is None: pk = None else: if isinstance(level, basestring): level = self.get_level_object(level) if not self.object_level_set.filter(level_id=level.pk).exists(): self.object_level_set.create(level=level) pk = level.pk for i in self.object_level_set.all(): if i.level_id != pk: i.users.remove(user) else: i.users.add(user) i.save() def set_group_level(self, group, level): """Set level of object for a user. :param whom: user the level is set for :type whom: User or unicode or str :param level: codename of level to set :type level: str or unicode """ logger.info('%s.set_group_level(%s, %s) called', *[unicode(p) for p in [self, group, level]]) if level is None: pk = None else: if isinstance(level, basestring): level = self.get_level_object(level) if not self.object_level_set.filter(level_id=level.pk).exists(): self.object_level_set.create(level=level) pk = level.pk for i in self.object_level_set.all(): if i.level_id != pk: i.groups.remove(group) else: i.groups.add(group) i.save() def has_level(self, user, level, group_also=True): logger.debug('%s.has_level(%s, %s, %s) called', *[unicode(p) for p in [self, user, level, group_also]]) if user is None or not user.is_authenticated(): return False if getattr(user, 'is_superuser', False): logger.debug('- superuser granted') return True if isinstance(level, basestring): level = self.get_level_object(level) logger.debug("- level set by str: %s", unicode(level)) object_levels = self.object_level_set.filter( level__weight__gte=level.weight).all() groups = user.groups.values_list('id', flat=True) if group_also else [] for i in object_levels: if i.users.filter(pk=user.pk).exists(): return True if group_also and i.groups.filter(pk__in=groups).exists(): return True return False def get_users_with_level(self): logger.debug('%s.get_users_with_level() called', unicode(self)) object_levels = (self.object_level_set.select_related( 'users', 'level').all()) users = [] for object_level in object_levels: name = object_level.level.codename olusers = object_level.users.all() users.extend([(u, name) for u in olusers]) logger.debug('- %s: %s' % (name, [u.username for u in olusers])) return users def get_groups_with_level(self): logger.debug('%s.get_groups_with_level() called', unicode(self)) object_levels = (self.object_level_set.select_related( 'groups', 'level').all()) groups = [] for object_level in object_levels: name = object_level.level.codename olgroups = object_level.groups.all() groups.extend([(g, name) for g in olgroups]) logger.debug('- %s: %s' % (name, [g.name for g in olgroups])) return groups @classmethod def get_objects_with_level(cls, level, user, group_also=True, owner_also=False): logger.debug('%s.get_objects_with_level(%s,%s) called', unicode(cls), unicode(level), unicode(user)) if user is None or not user.is_authenticated(): return cls.objects.none() if getattr(user, 'is_superuser', False): logger.debug('- superuser granted') return cls.objects if isinstance(level, basestring): level = cls.get_level_object(level) logger.debug("- level set by str: %s", unicode(level)) ct = ContentType.objects.get_for_model(cls) levelfilter = Q(users=user) if group_also: levelfilter |= Q(groups__in=user.groups.all()) ols = ObjectLevel.objects.filter( levelfilter, content_type=ct, level__weight__gte=level.weight).distinct() clsfilter = Q(object_level_set__in=ols.all()) if owner_also: clsfilter |= Q(owner=user) return cls.objects.filter(clsfilter) @classmethod def get_objects_with_group_level(cls, level, group): if isinstance(level, basestring): level = cls.get_level_object(level) ct = ContentType.objects.get_for_model(cls) levelfilter = Q(groups=group) ols = ObjectLevel.objects.filter( levelfilter, content_type=ct, level__weight__gte=level.weight).distinct() clsfilter = Q(object_level_set__in=ols.all()) return cls.objects.filter(clsfilter) def save(self, *args, **kwargs): super(AclBase, self).save(*args, **kwargs) if 'owner' in dict(self.ACL_LEVELS) and (hasattr(self, 'owner') and self.owner): self.set_user_level(self.owner, 'owner') class Meta: abstract = True tests/ 0000775 0000000 0000000 00000000000 12304627050 0027600 5 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/acl __init__.py 0000664 0000000 0000000 00000000000 12304627050 0031677 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/acl/tests models.py 0000664 0000000 0000000 00000001017 12304627050 0031434 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/acl/tests from django.db.models import TextField, ForeignKey from django.contrib.auth.models import User from ..models import AclBase class TestModel(AclBase): normal_field = TextField() ACL_LEVELS = ( ('alfa', 'Alfa'), ('bravo', 'Bravo'), ('charlie', 'Charlie'), ) class Test2Model(AclBase): normal2_field = TextField() owner = ForeignKey(User, null=True) ACL_LEVELS = ( ('one', 'One'), ('two', 'Two'), ('three', 'Three'), ('owner', 'owner'), ) test_acl.py 0000664 0000000 0000000 00000022041 12304627050 0031747 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/acl/tests from django.test import TestCase from django.contrib.auth.models import User, Group, AnonymousUser from ..models import ObjectLevel from .models import TestModel, Test2Model class AclUserTest(TestCase): def setUp(self): self.u1 = User.objects.create(username='user1') self.u2 = User.objects.create(username='user2', is_staff=True) self.us = User.objects.create(username='superuser', is_superuser=True) self.g1 = Group.objects.create(name='group1') self.g1.user_set.add(self.u1) self.g1.user_set.add(self.u2) self.g1.save() self.g2 = Group.objects.create(name='group2') self.g2.save() def test_level_exists(self): for codename, name in TestModel.ACL_LEVELS: level = TestModel.get_level_object(codename) self.assertEqual(level.codename, codename) for codename, name in Test2Model.ACL_LEVELS: level = Test2Model.get_level_object(codename) self.assertEqual(level.codename, codename) def test_lowest_user_level(self): i = TestModel.objects.create(normal_field='Hello') self.assertFalse(i.has_level(self.u1, 'alfa', False)) self.assertFalse(i.has_level(self.u1, 'bravo', False)) i.set_level(self.u1, 'alfa') i.set_level(self.g1, 'bravo') self.assertTrue(i.has_level(self.u1, 'alfa', False)) self.assertFalse(i.has_level(self.u1, 'bravo', False)) def test_anonymous_user_level(self): i = TestModel.objects.create(normal_field='Hello') anon = AnonymousUser() self.assertFalse(i.has_level(anon, 'alfa')) self.assertFalse(i.has_level(anon, 'bravo')) def test_middle_user_level(self): i = TestModel.objects.create(normal_field='Hello') self.assertFalse(i.has_level(self.u1, 'alfa')) self.assertFalse(i.has_level(self.u1, 'bravo')) self.assertFalse(i.has_level(self.u1, 'charlie')) i.set_level(self.u1, 'bravo') self.assertTrue(i.has_level(self.u1, 'alfa')) self.assertTrue(i.has_level(self.u1, 'bravo')) self.assertFalse(i.has_level(self.u1, 'charlie')) def test_level_set_twice_same(self): i = TestModel.objects.create(normal_field='Hello') self.assertFalse(i.has_level(self.u1, 'alfa')) self.assertFalse(i.has_level(self.u1, 'bravo')) self.assertFalse(i.has_level(self.u1, 'charlie')) i.set_level(self.u1, 'bravo') i.set_level(self.u1, 'bravo') self.assertTrue(i.has_level(self.u1, 'alfa')) self.assertTrue(i.has_level(self.u1, 'bravo')) self.assertFalse(i.has_level(self.u1, 'charlie')) def test_level_set_twice_different(self): i = TestModel.objects.create(normal_field='Hello') self.assertFalse(i.has_level(self.u1, 'alfa')) self.assertFalse(i.has_level(self.u1, 'bravo')) self.assertFalse(i.has_level(self.u1, 'charlie')) i.set_level(self.u1, 'charlie') i.set_level(self.u1, 'bravo') self.assertTrue(i.has_level(self.u1, 'alfa')) self.assertTrue(i.has_level(self.u1, 'bravo')) self.assertFalse(i.has_level(self.u1, 'charlie')) def test_superuser(self): i = TestModel.objects.create(normal_field='Hello') for u, v in [(self.u1, False), (self.u2, False), (self.us, True)]: self.assertEqual(i.has_level(u, 'alfa'), v) self.assertEqual(i.has_level(u, 'bravo'), v) self.assertEqual(i.has_level(u, 'charlie'), v) def test_check_group_membership(self): groups = self.u1.groups.values_list('id', flat=True) self.assertIn(self.g1.id, groups) self.assertTrue(self.g1.user_set.filter(id=self.u2.id).exists()) def test_lowest_group_level(self): i = TestModel.objects.create(normal_field='Hello') self.assertFalse(i.has_level(self.u1, 'alfa')) self.assertFalse(i.has_level(self.u1, 'bravo')) i.set_level(self.g1, 'alfa') self.assertTrue(i.has_level(self.u1, 'alfa')) self.assertFalse(i.has_level(self.u1, 'bravo')) def test_middle_group_level(self): i = TestModel.objects.create(normal_field='Hello') self.assertFalse(i.has_level(self.u1, 'alfa')) self.assertFalse(i.has_level(self.u1, 'bravo')) self.assertFalse(i.has_level(self.u1, 'charlie')) i.set_level(self.g1, 'bravo') self.assertTrue(i.has_level(self.u1, 'alfa')) self.assertTrue(i.has_level(self.u1, 'bravo')) self.assertFalse(i.has_level(self.u1, 'charlie')) def test_set_level_error_handling(self): with self.assertRaises(AttributeError): TestModel.objects.create().set_level('wrong arg', 'level') def test_get_users_with_level(self): i1 = TestModel.objects.create(normal_field='Hello') i2 = Test2Model.objects.create(normal2_field='Hello2') i1.set_level(self.u1, 'bravo') i1.set_level(self.u2, 'charlie') i2.set_level(self.u1, 'one') i2.set_level(self.us, u'three') res1 = i1.get_users_with_level() self.assertEqual([(self.u1, u'bravo'), (self.u2, u'charlie')], res1) res2 = i2.get_users_with_level() self.assertEqual([(self.u1, u'one'), (self.us, u'three')], res2) def test_get_groups_with_level(self): i1 = TestModel.objects.create(normal_field='Hello') i2 = Test2Model.objects.create(normal2_field='Hello2') i1.set_level(self.g1, 'bravo') i1.set_level(self.u2, 'charlie') i2.set_level(self.g1, 'one') i2.set_level(self.us, u'three') res1 = i1.get_groups_with_level() self.assertEqual([(self.g1, u'bravo')], res1) res2 = i2.get_groups_with_level() self.assertEqual([(self.g1, u'one')], res2) def test_object_level_unicode(self): i1 = TestModel.objects.create(normal_field='Hello') i1.set_level(self.g1, 'bravo') unicode(ObjectLevel.objects.all()[0]) def test_set_user_level_none(self): i = TestModel.objects.create(normal_field='Hello') i.set_level(self.u1, 'alfa') self.assertTrue(i.has_level(self.u1, 'alfa')) i.set_level(self.u1, None) self.assertFalse(i.has_level(self.u1, 'alfa')) def test_set_group_level_none(self): i = TestModel.objects.create(normal_field='Hello') i.set_level(self.g1, 'alfa') self.assertTrue(i.has_level(self.u1, 'alfa')) i.set_level(self.g1, None) self.assertFalse(i.has_level(self.u1, 'alfa')) def test_get_objects_with_level(self): i1 = TestModel.objects.create(normal_field='Hello1') i2 = TestModel.objects.create(normal_field='Hello2') i1.set_level(self.u1, 'alfa') i2.set_level(self.u1, 'bravo') i2.set_level(self.u2, 'bravo') self.assertItemsEqual( TestModel.get_objects_with_level('alfa', self.u1), [i1, i2]) self.assertItemsEqual( TestModel.get_objects_with_level('alfa', self.u2), [i2]) def test_get_objects_with_level_for_group(self): i1 = TestModel.objects.create(normal_field='Hello1') i2 = TestModel.objects.create(normal_field='Hello2') i1.set_level(self.g1, 'alfa') i2.set_level(self.g1, 'bravo') i2.set_level(self.u1, 'bravo') self.assertItemsEqual( TestModel.get_objects_with_level('alfa', self.u1), [i1, i2]) def test_get_objects_with_group_level(self): i1 = TestModel.objects.create(normal_field='Hello1') i2 = TestModel.objects.create(normal_field='Hello2') i1.set_level(self.g1, 'alfa') i2.set_level(self.g1, 'bravo') i2.set_level(self.g2, 'bravo') self.assertItemsEqual( TestModel.get_objects_with_group_level('alfa', self.g1), [i1, i2]) self.assertItemsEqual( TestModel.get_objects_with_group_level('alfa', self.g2), [i2]) def test_owner(self): i = Test2Model.objects.create(normal2_field='Hello', owner=self.u1) self.assertTrue(i.has_level(self.u1, 'one')) self.assertTrue(i.has_level(self.u1, 'owner')) self.assertFalse(i.has_level(self.u2, 'owner')) def test_owner_change(self): i = Test2Model.objects.create(normal2_field='Hello', owner=self.u1) self.assertTrue(i.has_level(self.u1, 'one')) self.assertTrue(i.has_level(self.u1, 'owner')) self.assertFalse(i.has_level(self.u2, 'owner')) i.owner = self.u2 i.save() self.assertTrue(i.has_level(self.u1, 'one')) self.assertTrue(i.has_level(self.u1, 'owner')) self.assertTrue(i.has_level(self.u2, 'owner')) def test_owner_change_from_none(self): i = Test2Model.objects.create(normal2_field='Hello') self.assertFalse(i.has_level(self.u1, 'one')) self.assertFalse(i.has_level(self.u1, 'owner')) self.assertFalse(i.has_level(self.u2, 'owner')) i.owner = self.u2 i.save() self.assertFalse(i.has_level(self.u1, 'one')) self.assertFalse(i.has_level(self.u1, 'owner')) self.assertTrue(i.has_level(self.u2, 'owner')) views.py 0000664 0000000 0000000 00000000032 12304627050 0030140 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/acl # Create your views here. circle/ 0000775 0000000 0000000 00000000000 12304627050 0027140 5 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle __init__.py 0000664 0000000 0000000 00000000000 12304627050 0031237 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/circle settings/ 0000775 0000000 0000000 00000000000 12304627050 0031000 5 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/circle __init__.py 0000664 0000000 0000000 00000000000 12304627050 0033077 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/circle/settings base.py 0000664 0000000 0000000 00000030411 12304627050 0032263 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/circle/settings """Common settings and globals.""" # flake8: noqa from os import environ from os.path import abspath, basename, dirname, join, normpath, isfile from sys import path from django.core.exceptions import ImproperlyConfigured from json import loads # from socket import SOCK_STREAM # Normally you should not import ANYTHING from Django directly # into your settings, but ImproperlyConfigured is an exception. def get_env_variable(var_name, default=None): """ Get the environment variable or return exception/default """ try: return environ[var_name] except KeyError: if default is None: error_msg = "Set the %s environment variable" % var_name raise ImproperlyConfigured(error_msg) else: return default ########## PATH CONFIGURATION # Absolute filesystem path to the Django project directory: DJANGO_ROOT = dirname(dirname(abspath(__file__))) # Absolute filesystem path to the top-level project folder: SITE_ROOT = dirname(DJANGO_ROOT) # Site name: SITE_NAME = basename(DJANGO_ROOT) # Url to site: (e.g. http://localhost:8080/) DJANGO_URL = get_env_variable('DJANGO_URL', '/') # Add our project to our pythonpath, this way we don't need to type our project # name in our dotted import paths: path.append(DJANGO_ROOT) ########## END PATH CONFIGURATION ########## DEBUG CONFIGURATION # See: https://docs.djangoproject.com/en/dev/ref/settings/#debug DEBUG = False # See: https://docs.djangoproject.com/en/dev/ref/settings/#template-debug TEMPLATE_DEBUG = DEBUG ########## END DEBUG CONFIGURATION ########## MANAGER CONFIGURATION # See: https://docs.djangoproject.com/en/dev/ref/settings/#admins ADMINS = ( ('Root', 'root@localhost'), ) # See: https://docs.djangoproject.com/en/dev/ref/settings/#managers MANAGERS = ADMINS ########## END MANAGER CONFIGURATION ########## DATABASE CONFIGURATION # See: https://docs.djangoproject.com/en/dev/ref/settings/#databases DATABASES = { 'default': { 'ENGINE': 'django.db.backends.' + get_env_variable('DJANG_DB_TYPE', 'postgresql_psycopg2'), 'NAME': get_env_variable('DJANGO_DB_NAME', 'circle'), 'USER': get_env_variable('DJANGO_DB_USER', 'circle'), 'PASSWORD': get_env_variable('DJANGO_DB_PASSWORD'), 'HOST': get_env_variable('DJANGO_DB_HOST', ''), 'PORT': get_env_variable('DJANGO_DB_PORT', ''), } } ########## END DATABASE CONFIGURATION ########## GENERAL CONFIGURATION # See: https://docs.djangoproject.com/en/dev/ref/settings/#time-zone try: with open("/etc/timezone", "r") as f: systz = f.readline().rstrip() except: systz = None TIME_ZONE = get_env_variable('DJANGO_TIME_ZONE', default=systz) # See: https://docs.djangoproject.com/en/dev/ref/settings/#language-code LANGUAGE_CODE = 'en-us' # See: https://docs.djangoproject.com/en/dev/ref/settings/#site-id SITE_ID = 1 # See: https://docs.djangoproject.com/en/dev/ref/settings/#use-i18n USE_I18N = True # See: https://docs.djangoproject.com/en/dev/ref/settings/#use-l10n USE_L10N = True # See: https://docs.djangoproject.com/en/dev/ref/settings/#use-tz USE_TZ = True ########## END GENERAL CONFIGURATION ########## MEDIA CONFIGURATION # See: https://docs.djangoproject.com/en/dev/ref/settings/#media-root MEDIA_ROOT = normpath(join(SITE_ROOT, 'media')) # See: https://docs.djangoproject.com/en/dev/ref/settings/#media-url MEDIA_URL = get_env_variable('DJANGO_MEDIA_URL', default='/media/') ########## END MEDIA CONFIGURATION ########## STATIC FILE CONFIGURATION # See: https://docs.djangoproject.com/en/dev/ref/settings/#static-root STATIC_ROOT = normpath(join(SITE_ROOT, 'static_collected')) # See: https://docs.djangoproject.com/en/dev/ref/settings/#static-url STATIC_URL = get_env_variable('DJANGO_STATIC_URL', default='/static/') # See: https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#std:setting-STATICFILES_DIRS STATICFILES_DIRS = ( normpath(join(SITE_ROOT, 'static')), ) # See: https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#staticfiles-finders STATICFILES_FINDERS = ( 'django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder', ) ########## END STATIC FILE CONFIGURATION ########## SECRET CONFIGURATION # See: https://docs.djangoproject.com/en/dev/ref/settings/#secret-key # Note: This key should only be used for development and testing. SECRET_KEY = r"a5w*b0wajigd^kd7b=@w=5=+l_0c62@vljnhzqu3dfc@vx2jw-" ########## END SECRET CONFIGURATION ########## SITE CONFIGURATION # Hosts/domain names that are valid for this site # See https://docs.djangoproject.com/en/1.5/ref/settings/#allowed-hosts ALLOWED_HOSTS = [] ########## END SITE CONFIGURATION ########## FIXTURE CONFIGURATION # See: https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-FIXTURE_DIRS FIXTURE_DIRS = ( normpath(join(SITE_ROOT, 'fixtures')), ) ########## END FIXTURE CONFIGURATION ########## TEMPLATE CONFIGURATION # See: https://docs.djangoproject.com/en/dev/ref/settings/#template-context-processors TEMPLATE_CONTEXT_PROCESSORS = ( 'django.contrib.auth.context_processors.auth', 'django.core.context_processors.debug', 'django.core.context_processors.i18n', 'django.core.context_processors.media', 'django.core.context_processors.static', 'django.core.context_processors.tz', 'django.contrib.messages.context_processors.messages', 'django.core.context_processors.request', ) # See: https://docs.djangoproject.com/en/dev/ref/settings/#template-loaders TEMPLATE_LOADERS = ( 'django.template.loaders.filesystem.Loader', 'django.template.loaders.app_directories.Loader', ) # See: https://docs.djangoproject.com/en/dev/ref/settings/#template-dirs TEMPLATE_DIRS = ( normpath(join(SITE_ROOT, 'templates')), ) ########## END TEMPLATE CONFIGURATION ########## MIDDLEWARE CONFIGURATION # See: https://docs.djangoproject.com/en/dev/ref/settings/#middleware-classes MIDDLEWARE_CLASSES = ( # Default Django middleware. 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ) ########## END MIDDLEWARE CONFIGURATION ########## URL CONFIGURATION # See: https://docs.djangoproject.com/en/dev/ref/settings/#root-urlconf ROOT_URLCONF = '%s.urls' % SITE_NAME ########## END URL CONFIGURATION ########## APP CONFIGURATION DJANGO_APPS = ( # Default Django apps: 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', # Useful template tags: # 'django.contrib.humanize', # Admin panel and documentation: 'django.contrib.admin', # 'django.contrib.admindocs', ) THIRD_PARTY_APPS = ( 'south', 'django_tables2', 'crispy_forms', 'djcelery', 'sizefield', 'taggit', ) # Apps specific for this project go here. LOCAL_APPS = ( 'common', 'vm', 'storage', 'firewall', 'network', 'dashboard', 'manager', 'acl', ) # See: https://docs.djangoproject.com/en/dev/ref/settings/#installed-apps INSTALLED_APPS = DJANGO_APPS + THIRD_PARTY_APPS + LOCAL_APPS ########## END APP CONFIGURATION ########## LOGGING CONFIGURATION # See: https://docs.djangoproject.com/en/dev/ref/settings/#logging # A sample logging configuration. The only tangible logging # performed by this configuration is to send an email to # the site admins on every HTTP 500 error when DEBUG=False. # See http://docs.djangoproject.com/en/dev/topics/logging for # more details on how to customize your logging configuration. LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'simple': { 'format': '%(asctime)s [%(levelname)s]: %(name)s %(message)s', 'datefmt': '%Y-%m-%d %H:%M:%S', }, }, 'filters': { 'require_debug_false': { '()': 'django.utils.log.RequireDebugFalse' } }, 'handlers': { 'mail_admins': { 'level': 'ERROR', 'filters': ['require_debug_false'], 'class': 'django.utils.log.AdminEmailHandler' }, 'syslog': { 'level': 'INFO', 'class': 'logging.handlers.SysLogHandler', 'formatter': 'simple', 'address': '/dev/log', # 'socktype': SOCK_STREAM, # 'address': ('host', '514'), } }, 'loggers': { 'django.request': { 'handlers': ['mail_admins', 'syslog'], 'level': 'INFO', 'propagate': True, }, } } ########## END LOGGING CONFIGURATION ########## WSGI CONFIGURATION # See: https://docs.djangoproject.com/en/dev/ref/settings/#wsgi-application WSGI_APPLICATION = '%s.wsgi.application' % SITE_NAME ########## END WSGI CONFIGURATION FIREWALL_SETTINGS = loads(get_env_variable('DJANGO_FIREWALL_SETTINGS')) CRISPY_TEMPLATE_PACK = 'bootstrap3' # format: id: (name, port, protocol) VM_ACCESS_PROTOCOLS = loads(get_env_variable('DJANGO_VM_ACCESS_PROTOCOLS', '''{"nx": ["NX", 22, "tcp"], "rdp": ["RDP", 3389, "tcp"], "ssh": ["SSH", 22, "tcp"]}''')) VM_SCHEDULER = 'manager.scheduler' #BROKER_URL = get_env_variable('AMQP_URI') #BROKER_URL=get_env_variable('AMQP_URI') CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': '127.0.0.1:11211', } } if get_env_variable('DJANGO_SAML', 'FALSE') == 'TRUE': try: from shutil import which # python >3.4 except ImportError: from shutilwhich import which from saml2 import BINDING_HTTP_POST, BINDING_HTTP_REDIRECT # INSTALLED_APPS += ( # needed only for testing djangosaml2 # 'djangosaml', # ) AUTHENTICATION_BACKENDS = ( 'django.contrib.auth.backends.ModelBackend', 'djangosaml2.backends.Saml2Backend', ) LOGIN_URL = '/saml2/login/' remote_metadata = join(SITE_ROOT, 'remote_metadata.xml') if not isfile(remote_metadata): raise ImproperlyConfigured('Download SAML2 metadata to %s' % remote_metadata) required_attrs = loads(get_env_variable('DJANGO_SAML_REQUIRED', '["uid"]')) optional_attrs = loads(get_env_variable('DJANGO_SAML_OPTIONAL', '["mail", "cn", "sn"]')) SAML_CONFIG = { 'xmlsec_binary': which('xmlsec1'), 'entityid': DJANGO_URL + 'saml2/metadata/', 'attribute_map_dir': join(SITE_ROOT, 'attribute-maps'), 'service': { 'sp': { 'name': SITE_NAME, 'endpoints': { 'assertion_consumer_service': [ (DJANGO_URL + 'saml2/acs/', BINDING_HTTP_POST), ], 'single_logout_service': [ (DJANGO_URL + 'saml2/ls/', BINDING_HTTP_REDIRECT), ], }, 'required_attributes': required_attrs, 'optional_attributes': optional_attrs, }, }, 'metadata': {'local': [remote_metadata], }, 'key_file': join(SITE_ROOT, 'samlcert.key'), # private part 'cert_file': join(SITE_ROOT, 'samlcert.pem'), # public part } try: SAML_CONFIG += loads(get_env_variable('DJANGO_SAML_SETTINGS')) except ImproperlyConfigured: pass SAML_CREATE_UNKNOWN_USER = True SAML_ATTRIBUTE_MAPPING = loads(get_env_variable( 'DJANGO_SAML_ATTRIBUTE_MAPPING', '{"mail": ["email"], "sn": ["last_name"], ' '"uid": ["username"], "cn": ["first_name"]}')) SAML_GROUP_ATTRIBUTES = get_env_variable( 'DJANGO_SAML_GROUP_ATTRIBUTES', '').split(',') SAML_GROUP_OWNER_ATTRIBUTES = get_env_variable( 'DJANGO_SAML_GROUP_OWNER_ATTRIBUTES', '').split(',') SAML_CREATE_UNKNOWN_USER = True if get_env_variable('DJANGO_SAML_ORG_ID_ATTRIBUTE', False) != False: SAML_ORG_ID_ATTRIBUTE = get_env_variable( 'DJANGO_SAML_ORG_ID_ATTRIBUTE') local.py 0000664 0000000 0000000 00000004447 12304627050 0032455 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/circle/settings """Development settings and globals.""" from base import * # noqa ########## DEBUG CONFIGURATION # See: https://docs.djangoproject.com/en/dev/ref/settings/#debug DEBUG = True # See: https://docs.djangoproject.com/en/dev/ref/settings/#template-debug TEMPLATE_DEBUG = DEBUG ########## END DEBUG CONFIGURATION ########## EMAIL CONFIGURATION # See: https://docs.djangoproject.com/en/dev/ref/settings/#email-backend EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' ########## END EMAIL CONFIGURATION ########## DATABASE CONFIGURATION # See: https://docs.djangoproject.com/en/dev/ref/settings/#databases # DATABASES = { # 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': normpath(join(DJANGO_ROOT, 'default.db')), # 'USER': '', # 'PASSWORD': '', # 'HOST': '', # 'PORT': '', # } # } ########## END DATABASE CONFIGURATION ########## CACHE CONFIGURATION # See: https://docs.djangoproject.com/en/dev/ref/settings/#caches CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', } } ########## END CACHE CONFIGURATION ########## TOOLBAR CONFIGURATION # https://github.com/django-debug-toolbar/django-debug-toolbar#installation if get_env_variable('DJANGO_TOOLBAR', 'FALSE') == 'TRUE': INSTALLED_APPS += ( 'debug_toolbar', ) # https://github.com/django-debug-toolbar/django-debug-toolbar#installation INTERNAL_IPS = ( get_env_variable('SSH_CLIENT', '127.0.0.1').split(' ')[0], ) # https://github.com/django-debug-toolbar/django-debug-toolbar#installation MIDDLEWARE_CLASSES += ( 'debug_toolbar.middleware.DebugToolbarMiddleware', ) # https://github.com/django-debug-toolbar/django-debug-toolbar#installation DEBUG_TOOLBAR_CONFIG = { 'INTERCEPT_REDIRECTS': False, 'SHOW_TEMPLATE_CONTEXT': True, } ########## END TOOLBAR CONFIGURATION LOGGING['loggers']['djangosaml2'] = {'handlers': ['console'], 'level': 'DEBUG'} LOGGING['handlers']['console'] = {'level': 'DEBUG', 'class': 'logging.StreamHandler', 'formatter': 'simple'} for i in LOCAL_APPS: LOGGING['loggers'][i] = {'handlers': ['console'], 'level': 'DEBUG'} CRISPY_FAIL_SILENTLY = not DEBUG production.py 0000664 0000000 0000000 00000004553 12304627050 0033547 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/circle/settings """Production settings and globals.""" from os import environ from base import * # noqa def get_env_setting(setting): """ Get the environment setting or return exception """ try: return environ[setting] except KeyError: error_msg = "Set the %s env variable" % setting raise ImproperlyConfigured(error_msg) ########## HOST CONFIGURATION # See: https://docs.djangoproject.com/en/1.5/releases/1.5/ # #allowed-hosts-required-in-production ALLOWED_HOSTS = get_env_setting('DJANGO_ALLOWED_HOSTS').split(',') ########## END HOST CONFIGURATION ########## EMAIL CONFIGURATION # See: https://docs.djangoproject.com/en/dev/ref/settings/#email-backend EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' try: # See: https://docs.djangoproject.com/en/dev/ref/settings/#email-host EMAIL_HOST = environ.get('EMAIL_HOST') except ImproperlyConfigured: pass else: # https://docs.djangoproject.com/en/dev/ref/settings/#email-host-password EMAIL_HOST_PASSWORD = environ.get('EMAIL_HOST_PASSWORD', '') # See: https://docs.djangoproject.com/en/dev/ref/settings/#email-host-user EMAIL_HOST_USER = environ.get('EMAIL_HOST_USER', 'your_email@example.com') # See: https://docs.djangoproject.com/en/dev/ref/settings/#email-port EMAIL_PORT = environ.get('EMAIL_PORT', 587) # See: https://docs.djangoproject.com/en/dev/ref/settings/#email-use-tls EMAIL_USE_TLS = True # See: https://docs.djangoproject.com/en/dev/ref/settings/#email-subject-prefix EMAIL_SUBJECT_PREFIX = '[%s] ' % SITE_NAME # See: https://docs.djangoproject.com/en/dev/ref/settings/#server-email SERVER_EMAIL = EMAIL_HOST_USER ########## END EMAIL CONFIGURATION ########## CACHE CONFIGURATION # See: https://docs.djangoproject.com/en/dev/ref/settings/#caches try: CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': get_env_variable('DJANGO_MEMCACHED'), } } except ImproperlyConfigured: CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 'LOCATION': SITE_NAME, } } ########## END CACHE CONFIGURATION ########## SECRET CONFIGURATION # See: https://docs.djangoproject.com/en/dev/ref/settings/#secret-key SECRET_KEY = get_env_setting('SECRET_KEY') ########## END SECRET CONFIGURATION test.py 0000664 0000000 0000000 00000001164 12304627050 0032333 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/circle/settings from base import * # noqa ########## TEST SETTINGS TEST_RUNNER = 'discover_runner.DiscoverRunner' TEST_DISCOVER_TOP_LEVEL = SITE_ROOT TEST_DISCOVER_ROOT = SITE_ROOT TEST_DISCOVER_PATTERN = "test_*.py" ########## IN-MEMORY TEST DATABASE DATABASES = { "default": { "ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:", "USER": "", "PASSWORD": "", "HOST": "", "PORT": "", }, } SOUTH_TESTS_MIGRATE = False INSTALLED_APPS += ( 'acl.tests', 'django_nose', ) CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.dummy.DummyCache' } } urls.py 0000664 0000000 0000000 00000001762 12304627050 0030505 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/circle from django.conf.urls import patterns, include, url # from django.views.generic import TemplateView from django.contrib import admin from django.shortcuts import redirect from django.core.urlresolvers import reverse from circle.settings.base import get_env_variable admin.autodiscover() urlpatterns = patterns( '', #url(r'^$', TemplateView.as_view(template_name='base.html')), # Examples: # url(r'^$', 'circle.views.home', name='home'), # url(r'^circle/', include('circle.foo.urls')), # url(r'^admin/doc/', include('django.contrib.admindocs.urls')), url(r'^$', lambda x: redirect(reverse("dashboard.index"))), url(r'^admin/', include(admin.site.urls)), url(r'^network/', include('network.urls')), url(r'^dashboard/', include('dashboard.urls')), url(r'^accounts/', include('django.contrib.auth.urls')), ) if get_env_variable('DJANGO_SAML', 'FALSE') == 'TRUE': urlpatterns += patterns( '', (r'^saml2/', include('djangosaml2.urls')), ) wsgi.py 0000664 0000000 0000000 00000003421 12304627050 0030463 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/circle """ WSGI config for circle project. This module contains the WSGI application used by Django's development server and any production WSGI deployments. It should expose a module-level variable named ``application``. Django's ``runserver`` and ``runfcgi`` commands discover this application via the ``WSGI_APPLICATION`` setting. Usually you will have the standard Django WSGI application here, but it also might make sense to replace the whole Django WSGI application with a custom one that later delegates to the Django one. For example, you could introduce WSGI middleware here, or combine a Django application with an application of another framework. """ import os from os.path import abspath, dirname from sys import path SITE_ROOT = dirname(dirname(abspath(__file__))) path.append(SITE_ROOT) # We defer to a DJANGO_SETTINGS_MODULE already in the environment. This breaks # if running multiple sites in the same mod_wsgi process. To fix this, use # mod_wsgi daemon mode with each site in its own daemon process, or use # os.environ["DJANGO_SETTINGS_MODULE"] = "jajaja.settings" os.environ.setdefault("DJANGO_SETTINGS_MODULE", "circle.settings.production") # This application object is used by any WSGI server configured to use this # file. This includes Django's development server, if the WSGI_APPLICATION # setting points here. from django.core.wsgi import get_wsgi_application _application = get_wsgi_application() def application(environ, start_response): # copy DJANGO_* wsgi-env vars to process-env for i in environ.keys(): if i.startswith('DJANGO_'): os.environ[i] = environ[i] return _application(environ, start_response) # Apply WSGI middleware here. # from helloworld.wsgi import HelloWorldApplication # application = HelloWorldApplication(application) common/ 0000775 0000000 0000000 00000000000 12304627050 0027167 5 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle __init__.py 0000664 0000000 0000000 00000000000 12304627050 0031266 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/common models.py 0000664 0000000 0000000 00000012241 12304627050 0031024 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/common from hashlib import sha224 from logging import getLogger from time import time from django.contrib.auth.models import User from django.core.cache import cache from django.db.models import (CharField, DateTimeField, ForeignKey, NullBooleanField, TextField) from django.utils import timezone from django.utils.translation import ugettext_lazy as _ from model_utils.models import TimeStampedModel logger = getLogger(__name__) class WorkerNotFound(Exception): pass def activitycontextimpl(act, on_abort=None, on_commit=None): try: yield act except BaseException as e: # BaseException is the common parent of Exception and # system-exiting exceptions, e.g. KeyboardInterrupt handler = None if on_abort is None else lambda a: on_abort(a, e) act.finish(succeeded=False, result=str(e), event_handler=handler) raise e else: act.finish(succeeded=True, event_handler=on_commit) class ActivityModel(TimeStampedModel): activity_code = CharField(max_length=100, verbose_name=_('activity code')) parent = ForeignKey('self', blank=True, null=True, related_name='children') task_uuid = CharField(blank=True, max_length=50, null=True, unique=True, help_text=_('Celery task unique identifier.'), verbose_name=_('task_uuid')) user = ForeignKey(User, blank=True, null=True, verbose_name=_('user'), help_text=_('The person who started this activity.')) started = DateTimeField(verbose_name=_('started at'), blank=True, null=True, help_text=_('Time of activity initiation.')) finished = DateTimeField(verbose_name=_('finished at'), blank=True, null=True, help_text=_('Time of activity finalization.')) succeeded = NullBooleanField(blank=True, null=True, help_text=_('True, if the activity has ' 'finished successfully.')) result = TextField(verbose_name=_('result'), blank=True, null=True, help_text=_('Human readable result of activity.')) def __unicode__(self): if self.parent: return self.parent.activity_code + "->" + self.activity_code else: return self.activity_code class Meta: abstract = True def finish(self, succeeded, result=None, event_handler=None): if not self.finished: self.finished = timezone.now() self.succeeded = succeeded if result is not None: self.result = result if event_handler is not None: event_handler(self) self.save() @property def has_succeeded(self): return self.finished and self.succeeded @property def has_failed(self): return self.finished and not self.succeeded def method_cache(memcached_seconds=60, instance_seconds=5): # noqa """Cache return value of decorated method to memcached and memory. :param memcached_seconds: Invalidate memcached results after this time. :param instance_seconds: Invalidate results cached to static memory after this time. If a result is cached on instance, return that first. If that fails, check memcached. If all else fails, run the method and cache on instance and in memcached. Do not use for methods with side effects. Instances are hashed by their id attribute, args by their unicode representation. ** NOTE: Methods that return None are always "recached". Based on https://djangosnippets.org/snippets/2477/ """ def inner_cache(method): def get_key(instance, *args, **kwargs): return sha224(unicode(method.__module__) + unicode(method.__name__) + unicode(instance.id) + unicode(args) + unicode(kwargs)).hexdigest() def x(instance, *args, **kwargs): invalidate = kwargs.pop('invalidate_cache', False) now = time() key = get_key(instance, *args, **kwargs) result = None try: vals = getattr(instance, key) except AttributeError: pass else: if vals['time'] + instance_seconds > now: # has valid on class cache, return that result = vals['value'] if result is None: result = cache.get(key) if invalidate or (result is None): # all caches failed, call the actual method result = method(instance, *args, **kwargs) # save to memcache and class attr cache.set(key, result, memcached_seconds) setattr(instance, key, {'time': now, 'value': result}) logger.debug('Value of <%s>.%s(%s)=<%s> saved to cache.', unicode(instance), method.__name__, unicode(args), unicode(result)) return result return x return inner_cache tests/ 0000775 0000000 0000000 00000000000 12304627050 0030331 5 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/common __init__.py 0000664 0000000 0000000 00000000000 12304627050 0032430 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/common/tests models.py 0000664 0000000 0000000 00000000464 12304627050 0032172 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/common/tests from ..models import method_cache class TestClass(object): id = None called = 0 def __init__(self, id): self.id = id @method_cache() def method(self, s): # print 'Called TestClass(%d).method(%s)' % (self.id, s) self.called += 1 return self.id + len(s) test_models.py 0000664 0000000 0000000 00000001443 12304627050 0033227 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/common/tests from django.test import TestCase from .models import TestClass class MethodCacheTestCase(TestCase): def test_cache(self): t1 = TestClass(1) t2 = TestClass(2) val1a = t1.method('a') val1b = t1.method('a') val2a = t2.method('a') val2b = t2.method('a') val2b = t2.method('a') self.assertEqual(val1a, val1b) self.assertEqual(val2a, val2b) self.assertNotEqual(val1a, val2a) t1.method('b') self.assertEqual(t1.called, 2) self.assertEqual(t2.called, 1) def test_invalidate(self): t1 = TestClass(1) val1a = t1.method('a') val1b = t1.method('a', invalidate_cache=True) t1.method('a') self.assertEqual(val1a, val1b) self.assertEqual(t1.called, 2) dashboard/ 0000775 0000000 0000000 00000000000 12304627050 0027626 5 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle __init__.py 0000664 0000000 0000000 00000000000 12304627050 0031725 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/dashboard fixtures/ 0000775 0000000 0000000 00000000000 12304627050 0031477 5 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/dashboard node.json 0000664 0000000 0000000 00000003003 12304627050 0033313 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/dashboard/fixtures [ { "pk": 1, "model": "firewall.vlan", "fields": { "comment": "", "ipv6_template": "2001:7:2:4031:%(b)d:%(c)d:%(d)d:0", "domain": 1, "dhcp_pool": "", "managed": true, "name": "pub", "vid": 3066, "created_at": "2014-02-19T17:00:17.358Z", "modified_at": "2014-02-19T17:00:17.358Z", "owner": null, "snat_ip": null, "snat_to": [], "network6": null, "network4": "10.7.0.93/16", "reverse_domain": "%(d)d.%(c)d.%(b)d.%(a)d.in-addr.arpa", "network_type": "public", "description": "" } }, { "pk": 1, "model": "firewall.host", "fields": { "comment": "", "vlan": 1, "reverse": "", "created_at": "2014-02-19T17:03:45.365Z", "hostname": "devenv", "modified_at": "2014-02-24T15:55:01.412Z", "location": "", "pub_ipv4": null, "mac": "11:22:33:44:55:66", "shared_ip": false, "ipv4": "10.7.0.96", "groups": [], "ipv6": null, "owner": 1, "description": "" } }, { "pk": 1, "model": "firewall.domain", "fields": { "description": "", "created_at": "2014-02-19T17:00:08.819Z", "modified_at": "2014-02-19T17:00:08.819Z", "ttl": 600, "owner": 1, "name": "test.ik.bme.hu" } }, { "pk": 1, "model": "vm.node", "fields": { "name": "devenv", "created": "2014-02-19T17:03:45.322Z", "overcommit": 1.0, "enabled": true, "modified": "2014-02-19T21:11:34.671Z", "priority": 1, "traits": [], "host": 1 } } ] test-vm-fixture.json 0000664 0000000 0000000 00000065210 12304627050 0035461 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/dashboard/fixtures [ { "pk": 1, "model": "sites.site", "fields": { "domain": "example.com", "name": "example.com" } }, { "pk": 1, "model": "vm.lease", "fields": { "suspend_interval_seconds": 18000, "name": "lab", "delete_interval_seconds": 180000 } }, { "pk": 1, "model": "storage.datastore", "fields": { "path": "/disks", "hostname": "wut", "name": "diszkek" } }, { "pk": 1, "model": "storage.disk", "fields": { "name": "diszk", "created": "2013-09-16T09:05:56.926Z", "modified": "2013-09-19T09:10:25.117Z", "filename": "disc.img", "destroyed": null, "base": null, "ready": true, "datastore": 1, "dev_num": "a", "type": "qcow2-norm", "size": 8589934592 } }, { "pk": 1, "model": "auth.permission", "fields": { "codename": "add_permission", "name": "Can add permission", "content_type": 1 } }, { "pk": 2, "model": "auth.permission", "fields": { "codename": "change_permission", "name": "Can change permission", "content_type": 1 } }, { "pk": 3, "model": "auth.permission", "fields": { "codename": "delete_permission", "name": "Can delete permission", "content_type": 1 } }, { "pk": 4, "model": "auth.permission", "fields": { "codename": "add_group", "name": "Can add group", "content_type": 2 } }, { "pk": 5, "model": "auth.permission", "fields": { "codename": "change_group", "name": "Can change group", "content_type": 2 } }, { "pk": 6, "model": "auth.permission", "fields": { "codename": "delete_group", "name": "Can delete group", "content_type": 2 } }, { "pk": 7, "model": "auth.permission", "fields": { "codename": "add_user", "name": "Can add user", "content_type": 3 } }, { "pk": 8, "model": "auth.permission", "fields": { "codename": "change_user", "name": "Can change user", "content_type": 3 } }, { "pk": 9, "model": "auth.permission", "fields": { "codename": "delete_user", "name": "Can delete user", "content_type": 3 } }, { "pk": 10, "model": "auth.permission", "fields": { "codename": "add_contenttype", "name": "Can add content type", "content_type": 4 } }, { "pk": 11, "model": "auth.permission", "fields": { "codename": "change_contenttype", "name": "Can change content type", "content_type": 4 } }, { "pk": 12, "model": "auth.permission", "fields": { "codename": "delete_contenttype", "name": "Can delete content type", "content_type": 4 } }, { "pk": 13, "model": "auth.permission", "fields": { "codename": "add_session", "name": "Can add session", "content_type": 5 } }, { "pk": 14, "model": "auth.permission", "fields": { "codename": "change_session", "name": "Can change session", "content_type": 5 } }, { "pk": 15, "model": "auth.permission", "fields": { "codename": "delete_session", "name": "Can delete session", "content_type": 5 } }, { "pk": 16, "model": "auth.permission", "fields": { "codename": "add_site", "name": "Can add site", "content_type": 6 } }, { "pk": 17, "model": "auth.permission", "fields": { "codename": "change_site", "name": "Can change site", "content_type": 6 } }, { "pk": 18, "model": "auth.permission", "fields": { "codename": "delete_site", "name": "Can delete site", "content_type": 6 } }, { "pk": 19, "model": "auth.permission", "fields": { "codename": "add_logentry", "name": "Can add log entry", "content_type": 7 } }, { "pk": 20, "model": "auth.permission", "fields": { "codename": "change_logentry", "name": "Can change log entry", "content_type": 7 } }, { "pk": 21, "model": "auth.permission", "fields": { "codename": "delete_logentry", "name": "Can delete log entry", "content_type": 7 } }, { "pk": 22, "model": "auth.permission", "fields": { "codename": "add_migrationhistory", "name": "Can add migration history", "content_type": 8 } }, { "pk": 23, "model": "auth.permission", "fields": { "codename": "change_migrationhistory", "name": "Can change migration history", "content_type": 8 } }, { "pk": 24, "model": "auth.permission", "fields": { "codename": "delete_migrationhistory", "name": "Can delete migration history", "content_type": 8 } }, { "pk": 25, "model": "auth.permission", "fields": { "codename": "add_namedbaseresourceconfig", "name": "Can add named base resource config", "content_type": 9 } }, { "pk": 26, "model": "auth.permission", "fields": { "codename": "change_namedbaseresourceconfig", "name": "Can change named base resource config", "content_type": 9 } }, { "pk": 27, "model": "auth.permission", "fields": { "codename": "delete_namedbaseresourceconfig", "name": "Can delete named base resource config", "content_type": 9 } }, { "pk": 28, "model": "auth.permission", "fields": { "codename": "add_node", "name": "Can add node", "content_type": 10 } }, { "pk": 29, "model": "auth.permission", "fields": { "codename": "change_node", "name": "Can change node", "content_type": 10 } }, { "pk": 30, "model": "auth.permission", "fields": { "codename": "delete_node", "name": "Can delete node", "content_type": 10 } }, { "pk": 31, "model": "auth.permission", "fields": { "codename": "add_nodeactivity", "name": "Can add node activity", "content_type": 11 } }, { "pk": 32, "model": "auth.permission", "fields": { "codename": "change_nodeactivity", "name": "Can change node activity", "content_type": 11 } }, { "pk": 33, "model": "auth.permission", "fields": { "codename": "delete_nodeactivity", "name": "Can delete node activity", "content_type": 11 } }, { "pk": 34, "model": "auth.permission", "fields": { "codename": "add_lease", "name": "Can add lease", "content_type": 12 } }, { "pk": 35, "model": "auth.permission", "fields": { "codename": "change_lease", "name": "Can change lease", "content_type": 12 } }, { "pk": 36, "model": "auth.permission", "fields": { "codename": "delete_lease", "name": "Can delete lease", "content_type": 12 } }, { "pk": 37, "model": "auth.permission", "fields": { "codename": "add_instancetemplate", "name": "Can add template", "content_type": 13 } }, { "pk": 38, "model": "auth.permission", "fields": { "codename": "change_instancetemplate", "name": "Can change template", "content_type": 13 } }, { "pk": 39, "model": "auth.permission", "fields": { "codename": "delete_instancetemplate", "name": "Can delete template", "content_type": 13 } }, { "pk": 40, "model": "auth.permission", "fields": { "codename": "add_interfacetemplate", "name": "Can add interface template", "content_type": 14 } }, { "pk": 41, "model": "auth.permission", "fields": { "codename": "change_interfacetemplate", "name": "Can change interface template", "content_type": 14 } }, { "pk": 42, "model": "auth.permission", "fields": { "codename": "delete_interfacetemplate", "name": "Can delete interface template", "content_type": 14 } }, { "pk": 43, "model": "auth.permission", "fields": { "codename": "add_instance", "name": "Can add instance", "content_type": 15 } }, { "pk": 44, "model": "auth.permission", "fields": { "codename": "change_instance", "name": "Can change instance", "content_type": 15 } }, { "pk": 45, "model": "auth.permission", "fields": { "codename": "delete_instance", "name": "Can delete instance", "content_type": 15 } }, { "pk": 46, "model": "auth.permission", "fields": { "codename": "add_instanceactivity", "name": "Can add instance activity", "content_type": 16 } }, { "pk": 47, "model": "auth.permission", "fields": { "codename": "change_instanceactivity", "name": "Can change instance activity", "content_type": 16 } }, { "pk": 48, "model": "auth.permission", "fields": { "codename": "delete_instanceactivity", "name": "Can delete instance activity", "content_type": 16 } }, { "pk": 49, "model": "auth.permission", "fields": { "codename": "add_interface", "name": "Can add interface", "content_type": 17 } }, { "pk": 50, "model": "auth.permission", "fields": { "codename": "change_interface", "name": "Can change interface", "content_type": 17 } }, { "pk": 51, "model": "auth.permission", "fields": { "codename": "delete_interface", "name": "Can delete interface", "content_type": 17 } }, { "pk": 52, "model": "auth.permission", "fields": { "codename": "add_datastore", "name": "Can add datastore", "content_type": 18 } }, { "pk": 53, "model": "auth.permission", "fields": { "codename": "change_datastore", "name": "Can change datastore", "content_type": 18 } }, { "pk": 54, "model": "auth.permission", "fields": { "codename": "delete_datastore", "name": "Can delete datastore", "content_type": 18 } }, { "pk": 55, "model": "auth.permission", "fields": { "codename": "add_disk", "name": "Can add disk", "content_type": 19 } }, { "pk": 56, "model": "auth.permission", "fields": { "codename": "change_disk", "name": "Can change disk", "content_type": 19 } }, { "pk": 57, "model": "auth.permission", "fields": { "codename": "delete_disk", "name": "Can delete disk", "content_type": 19 } }, { "pk": 58, "model": "auth.permission", "fields": { "codename": "add_rule", "name": "Can add rule", "content_type": 20 } }, { "pk": 59, "model": "auth.permission", "fields": { "codename": "change_rule", "name": "Can change rule", "content_type": 20 } }, { "pk": 60, "model": "auth.permission", "fields": { "codename": "delete_rule", "name": "Can delete rule", "content_type": 20 } }, { "pk": 61, "model": "auth.permission", "fields": { "codename": "add_vlan", "name": "Can add vlan", "content_type": 21 } }, { "pk": 62, "model": "auth.permission", "fields": { "codename": "change_vlan", "name": "Can change vlan", "content_type": 21 } }, { "pk": 63, "model": "auth.permission", "fields": { "codename": "delete_vlan", "name": "Can delete vlan", "content_type": 21 } }, { "pk": 64, "model": "auth.permission", "fields": { "codename": "add_vlangroup", "name": "Can add vlan group", "content_type": 22 } }, { "pk": 65, "model": "auth.permission", "fields": { "codename": "change_vlangroup", "name": "Can change vlan group", "content_type": 22 } }, { "pk": 66, "model": "auth.permission", "fields": { "codename": "delete_vlangroup", "name": "Can delete vlan group", "content_type": 22 } }, { "pk": 67, "model": "auth.permission", "fields": { "codename": "add_group", "name": "Can add group", "content_type": 23 } }, { "pk": 68, "model": "auth.permission", "fields": { "codename": "change_group", "name": "Can change group", "content_type": 23 } }, { "pk": 69, "model": "auth.permission", "fields": { "codename": "delete_group", "name": "Can delete group", "content_type": 23 } }, { "pk": 70, "model": "auth.permission", "fields": { "codename": "add_host", "name": "Can add host", "content_type": 24 } }, { "pk": 71, "model": "auth.permission", "fields": { "codename": "change_host", "name": "Can change host", "content_type": 24 } }, { "pk": 72, "model": "auth.permission", "fields": { "codename": "delete_host", "name": "Can delete host", "content_type": 24 } }, { "pk": 73, "model": "auth.permission", "fields": { "codename": "add_firewall", "name": "Can add firewall", "content_type": 25 } }, { "pk": 74, "model": "auth.permission", "fields": { "codename": "change_firewall", "name": "Can change firewall", "content_type": 25 } }, { "pk": 75, "model": "auth.permission", "fields": { "codename": "delete_firewall", "name": "Can delete firewall", "content_type": 25 } }, { "pk": 76, "model": "auth.permission", "fields": { "codename": "add_domain", "name": "Can add domain", "content_type": 26 } }, { "pk": 77, "model": "auth.permission", "fields": { "codename": "change_domain", "name": "Can change domain", "content_type": 26 } }, { "pk": 78, "model": "auth.permission", "fields": { "codename": "delete_domain", "name": "Can delete domain", "content_type": 26 } }, { "pk": 79, "model": "auth.permission", "fields": { "codename": "add_record", "name": "Can add record", "content_type": 27 } }, { "pk": 80, "model": "auth.permission", "fields": { "codename": "change_record", "name": "Can change record", "content_type": 27 } }, { "pk": 81, "model": "auth.permission", "fields": { "codename": "delete_record", "name": "Can delete record", "content_type": 27 } }, { "pk": 82, "model": "auth.permission", "fields": { "codename": "add_blacklist", "name": "Can add blacklist", "content_type": 28 } }, { "pk": 83, "model": "auth.permission", "fields": { "codename": "change_blacklist", "name": "Can change blacklist", "content_type": 28 } }, { "pk": 84, "model": "auth.permission", "fields": { "codename": "delete_blacklist", "name": "Can delete blacklist", "content_type": 28 } }, { "pk": 85, "model": "auth.permission", "fields": { "codename": "add_taskmeta", "name": "Can add task state", "content_type": 29 } }, { "pk": 86, "model": "auth.permission", "fields": { "codename": "change_taskmeta", "name": "Can change task state", "content_type": 29 } }, { "pk": 87, "model": "auth.permission", "fields": { "codename": "delete_taskmeta", "name": "Can delete task state", "content_type": 29 } }, { "pk": 88, "model": "auth.permission", "fields": { "codename": "add_tasksetmeta", "name": "Can add saved group result", "content_type": 30 } }, { "pk": 89, "model": "auth.permission", "fields": { "codename": "change_tasksetmeta", "name": "Can change saved group result", "content_type": 30 } }, { "pk": 90, "model": "auth.permission", "fields": { "codename": "delete_tasksetmeta", "name": "Can delete saved group result", "content_type": 30 } }, { "pk": 91, "model": "auth.permission", "fields": { "codename": "add_intervalschedule", "name": "Can add interval", "content_type": 31 } }, { "pk": 92, "model": "auth.permission", "fields": { "codename": "change_intervalschedule", "name": "Can change interval", "content_type": 31 } }, { "pk": 93, "model": "auth.permission", "fields": { "codename": "delete_intervalschedule", "name": "Can delete interval", "content_type": 31 } }, { "pk": 94, "model": "auth.permission", "fields": { "codename": "add_crontabschedule", "name": "Can add crontab", "content_type": 32 } }, { "pk": 95, "model": "auth.permission", "fields": { "codename": "change_crontabschedule", "name": "Can change crontab", "content_type": 32 } }, { "pk": 96, "model": "auth.permission", "fields": { "codename": "delete_crontabschedule", "name": "Can delete crontab", "content_type": 32 } }, { "pk": 97, "model": "auth.permission", "fields": { "codename": "add_periodictasks", "name": "Can add periodic tasks", "content_type": 33 } }, { "pk": 98, "model": "auth.permission", "fields": { "codename": "change_periodictasks", "name": "Can change periodic tasks", "content_type": 33 } }, { "pk": 99, "model": "auth.permission", "fields": { "codename": "delete_periodictasks", "name": "Can delete periodic tasks", "content_type": 33 } }, { "pk": 100, "model": "auth.permission", "fields": { "codename": "add_periodictask", "name": "Can add periodic task", "content_type": 34 } }, { "pk": 101, "model": "auth.permission", "fields": { "codename": "change_periodictask", "name": "Can change periodic task", "content_type": 34 } }, { "pk": 102, "model": "auth.permission", "fields": { "codename": "delete_periodictask", "name": "Can delete periodic task", "content_type": 34 } }, { "pk": 103, "model": "auth.permission", "fields": { "codename": "add_workerstate", "name": "Can add worker", "content_type": 35 } }, { "pk": 104, "model": "auth.permission", "fields": { "codename": "change_workerstate", "name": "Can change worker", "content_type": 35 } }, { "pk": 105, "model": "auth.permission", "fields": { "codename": "delete_workerstate", "name": "Can delete worker", "content_type": 35 } }, { "pk": 106, "model": "auth.permission", "fields": { "codename": "add_taskstate", "name": "Can add task", "content_type": 36 } }, { "pk": 107, "model": "auth.permission", "fields": { "codename": "change_taskstate", "name": "Can change task", "content_type": 36 } }, { "pk": 108, "model": "auth.permission", "fields": { "codename": "delete_taskstate", "name": "Can delete task", "content_type": 36 } }, { "pk": 109, "model": "auth.permission", "fields": { "codename": "add_userobjectpermission", "name": "Can add user object permission", "content_type": 37 } }, { "pk": 110, "model": "auth.permission", "fields": { "codename": "change_userobjectpermission", "name": "Can change user object permission", "content_type": 37 } }, { "pk": 111, "model": "auth.permission", "fields": { "codename": "delete_userobjectpermission", "name": "Can delete user object permission", "content_type": 37 } }, { "pk": 112, "model": "auth.permission", "fields": { "codename": "add_groupobjectpermission", "name": "Can add group object permission", "content_type": 38 } }, { "pk": 113, "model": "auth.permission", "fields": { "codename": "change_groupobjectpermission", "name": "Can change group object permission", "content_type": 38 } }, { "pk": 114, "model": "auth.permission", "fields": { "codename": "delete_groupobjectpermission", "name": "Can delete group object permission", "content_type": 38 } }, { "pk": 115, "model": "auth.permission", "fields": { "codename": "own_instance", "name": "owner", "content_type": 15 } }, { "pk": 116, "model": "auth.permission", "fields": { "codename": "operate_instance", "name": "operator", "content_type": 15 } }, { "pk": 117, "model": "auth.permission", "fields": { "codename": "use_instance", "name": "user", "content_type": 15 } }, { "pk": 118, "model": "auth.permission", "fields": { "codename": "add_diskactivity", "name": "Can add disk activity", "content_type": 39 } }, { "pk": 119, "model": "auth.permission", "fields": { "codename": "change_diskactivity", "name": "Can change disk activity", "content_type": 39 } }, { "pk": 120, "model": "auth.permission", "fields": { "codename": "delete_diskactivity", "name": "Can delete disk activity", "content_type": 39 } }, { "pk": 121, "model": "auth.permission", "fields": { "codename": "add_level", "name": "Can add level", "content_type": 40 } }, { "pk": 122, "model": "auth.permission", "fields": { "codename": "change_level", "name": "Can change level", "content_type": 40 } }, { "pk": 123, "model": "auth.permission", "fields": { "codename": "delete_level", "name": "Can delete level", "content_type": 40 } }, { "pk": 127, "model": "auth.permission", "fields": { "codename": "add_objectlevel", "name": "Can add object level", "content_type": 42 } }, { "pk": 128, "model": "auth.permission", "fields": { "codename": "change_objectlevel", "name": "Can change object level", "content_type": 42 } }, { "pk": 129, "model": "auth.permission", "fields": { "codename": "delete_objectlevel", "name": "Can delete object level", "content_type": 42 } }, { "pk": 130, "model": "auth.permission", "fields": { "codename": "add_switchport", "name": "Can add switch port", "content_type": 43 } }, { "pk": 131, "model": "auth.permission", "fields": { "codename": "change_switchport", "name": "Can change switch port", "content_type": 43 } }, { "pk": 132, "model": "auth.permission", "fields": { "codename": "delete_switchport", "name": "Can delete switch port", "content_type": 43 } }, { "pk": 133, "model": "auth.permission", "fields": { "codename": "add_ethernetdevice", "name": "Can add ethernet device", "content_type": 44 } }, { "pk": 134, "model": "auth.permission", "fields": { "codename": "change_ethernetdevice", "name": "Can change ethernet device", "content_type": 44 } }, { "pk": 135, "model": "auth.permission", "fields": { "codename": "delete_ethernetdevice", "name": "Can delete ethernet device", "content_type": 44 } }, { "pk": 1, "model": "auth.group", "fields": { "name": "csopi", "permissions": [] } }, { "pk": 2, "model": "auth.group", "fields": { "name": "akkorszia", "permissions": [] } }, { "pk": 3, "model": "auth.group", "fields": { "name": "akkountsoherek", "permissions": [] } }, { "pk": 4, "model": "auth.group", "fields": { "name": "helog", "permissions": [] } }, { "pk": -1, "model": "auth.user", "fields": { "username": "AnonymousUser", "first_name": "", "last_name": "", "is_active": true, "is_superuser": false, "is_staff": false, "last_login": "2013-09-30T12:37:38.484Z", "groups": [], "user_permissions": [], "password": "", "email": "", "date_joined": "2013-09-30T12:37:38.484Z" } }, { "pk": 1, "model": "auth.user", "fields": { "username": "test", "first_name": "", "last_name": "", "is_active": true, "is_superuser": true, "is_staff": true, "last_login": "2013-11-09T03:40:23.157Z", "groups": [], "user_permissions": [ 115 ], "password": "pbkdf2_sha256$10000$KIoeMs78MiOj$PnVXn3YJMehbOciBO32CMzqL0ZnQrzrdb7+b5dE13os=", "email": "test@example.org", "date_joined": "2013-09-04T15:29:49.914Z" } }, { "pk": 3, "model": "auth.user", "fields": { "username": "proba", "first_name": "", "last_name": "", "is_active": true, "is_superuser": false, "is_staff": false, "last_login": "2013-10-14T06:59:48Z", "groups": [ 1 ], "user_permissions": [], "password": "", "email": "", "date_joined": "2013-10-14T06:59:48Z" } }, { "pk": 4, "model": "auth.user", "fields": { "username": "helo", "first_name": "", "last_name": "", "is_active": true, "is_superuser": false, "is_staff": false, "last_login": "2013-11-09T01:11:41.534Z", "groups": [ 4 ], "user_permissions": [], "password": "", "email": "", "date_joined": "2013-11-09T01:11:41.534Z" } }, { "pk": 1, "model": "vm.instance", "fields": { "destroyed": null, "disks": [ 1 ], "boot_menu": false, "owner": 1, "time_of_delete": null, "max_ram_size": 200, "pw": "ads", "time_of_suspend": null, "ram_size": 200, "priority": 4, "active_since": null, "template": null, "access_method": "nx", "lease": 1, "node": null, "description": "", "arch": "x86_64", "name": "vanneve", "created": "2013-09-16T09:05:59.991Z", "raw_data": "", "vnc_port": 1234, "num_cores": 2, "modified": "2013-10-14T07:27:38.192Z" } }, { "pk": 1, "model": "firewall.domain", "fields": { "description": "", "created_at": "2013-09-12T14:53:04.035Z", "modified_at": "2013-10-02T14:01:00.318Z", "ttl": 600, "owner": 1, "name": "test domain" } }, { "pk": 2, "model": "firewall.vlan", "fields": { "comment": "", "domain": 1, "dhcp_pool": "", "name": "test vlan", "vid": 1, "created_at": "2013-09-12T14:54:24.044Z", "modified_at": "2013-10-21T11:19:44.544Z", "owner": null, "snat_ip": null, "snat_to": [], "network6": null, "network4": "192.168.1.0/24", "reverse_domain": "%(d)d.%(c)d.%(b2)d.%(a)d.in-addr.arpa", "network_type": "public", "description": "" } }, { "pk": 1, "model": "firewall.vlan", "fields": { "comment": "", "domain": 1, "dhcp_pool": "", "managed": true, "name": "pub", "vid": 1066, "created_at": "2014-01-23T16:51:58.125Z", "modified_at": "2014-01-23T16:51:58.125Z", "owner": null, "snat_ip": null, "snat_to": [], "network6": null, "network4": "152.66.254.61/30", "reverse_domain": "%(d)d.%(c)d.%(b)d.%(a)d.in-addr.arpa", "network_type": "public", "description": "" } }, { "pk": 1, "model": "vm.lease", "fields": { "suspend_interval_seconds": 36000, "name": "alap", "delete_interval_seconds": 360000 } }, { "pk": 2, "model": "vm.interfacetemplate", "fields": { "vlan": 1, "managed": true, "template": 1 } }, { "pk": 1, "model": "vm.instancetemplate", "fields": { "req_traits": [], "disks": [ 1 ], "name": "ubuntu", "parent": null, "created": "2014-01-23T18:03:52.319Z", "num_cores": 2, "description": "", "boot_menu": false, "ram_size": 1024, "modified": "2014-01-24T00:58:19.654Z", "system": "", "priority": 20, "access_method": "ssh", "raw_data": "", "arch": "x86_64", "max_ram_size": 1024, "lease": 1, "owner": 1 } } ] forms.py 0000664 0000000 0000000 00000072520 12304627050 0031334 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/dashboard from datetime import timedelta import uuid from django.contrib.auth.models import User from crispy_forms.helper import FormHelper from crispy_forms.layout import ( Layout, Div, BaseInput, Field, HTML, Submit, Fieldset, TEMPLATE_PACK ) from crispy_forms.utils import render_field from django import forms from django.forms.widgets import TextInput from django.template import Context from django.template.loader import render_to_string from django.utils.translation import ugettext as _ from sizefield.widgets import FileSizeWidget from firewall.models import Vlan, Host from storage.models import Disk, DataStore from vm.models import InstanceTemplate, Lease, InterfaceTemplate, Node VLANS = Vlan.objects.all() DISKS = Disk.objects.exclude(type="qcow2-snap") class VmCustomizeForm(forms.Form): name = forms.CharField() cpu_priority = forms.IntegerField() cpu_count = forms.IntegerField() ram_size = forms.IntegerField() disks = forms.ModelMultipleChoiceField( queryset=None, required=True) networks = forms.ModelMultipleChoiceField( queryset=None, required=False) template = forms.CharField() customized = forms.CharField() # dummy flag field def __init__(self, *args, **kwargs): self.user = kwargs.pop("user", None) self.template = kwargs.pop("template", None) super(VmCustomizeForm, self).__init__(*args, **kwargs) # set displayed disk and network list self.fields['disks'].queryset = Disk.get_objects_with_level( 'user', self.user).exclude(type="qcow2-snap") self.fields['networks'].queryset = Vlan.get_objects_with_level( 'user', self.user) # set initial for disk and network list self.initial['disks'] = self.template.disks.all() self.initial['networks'] = InterfaceTemplate.objects.filter( template=self.template).values_list("vlan", flat=True) # set initial for resources self.initial['cpu_priority'] = self.template.priority self.initial['cpu_count'] = self.template.num_cores self.initial['ram_size'] = self.template.ram_size # initial name and template pk self.initial['name'] = self.template.name self.initial['template'] = self.template.pk self.initial['customized'] = self.template.pk self.helper = FormHelper(self) self.helper.form_show_labels = False self.helper.layout = Layout( Field("template", type="hidden"), Field("customized", type="hidden"), Div( # buttons Div( AnyTag( # tip: don't try to use Button class "button", AnyTag( "i", css_class="icon-play" ), HTML(" Start"), css_id="vm-create-customized-start", css_class="btn btn-success", ), css_class="col-sm-11 text-right", ), css_class="row", ), Div( Div( Field("name"), css_class="col-sm-5", ), css_class="row", ), Div( Div( AnyTag( 'h2', HTML(_("Resources")), ), css_class="col-sm-12", ), css_class="row", ), Div( # cpu priority Div( HTML(''), css_class="col-sm-3" ), Div( Field('cpu_priority', id="vm-cpu-priority-slider", css_class="vm-slider", data_slider_min="0", data_slider_max="100", data_slider_step="1", data_slider_value=self.template.priority, data_slider_handle="square", data_slider_tooltip="hide"), css_class="col-sm-9" ), css_class="row" ), Div( # cpu count Div( HTML(''), css_class="col-sm-3" ), Div( Field('cpu_count', id="vm-cpu-count-slider", css_class="vm-slider", data_slider_min="1", data_slider_max="8", data_slider_step="1", data_slider_value=self.template.num_cores, data_slider_handle="square", data_slider_tooltip="hide"), css_class="col-sm-9" ), css_class="row" ), Div( # ram size Div( HTML(''), css_class="col-sm-3" ), Div( Field('ram_size', id="vm-ram-size-slider", css_class="vm-slider", data_slider_min="128", data_slider_max="4096", data_slider_step="128", data_slider_value=self.template.ram_size, data_slider_handle="square", data_slider_tooltip="hide"), css_class="col-sm-9" ), css_class="row" ), Div( # disks Div( AnyTag( "h2", HTML("Disks") ), css_class="col-sm-4", ), Div( Div( Field("disks", css_class="form-control", id="vm-create-disk-add-form"), css_class="js-hidden", style="padding-top: 15px; max-width: 450px;", ), Div( AnyTag( "h3", HTML(_("No disks are added!")), css_id="vm-create-disk-list", ), AnyTag( "h3", Div( AnyTag( "select", css_class="form-control", css_id="vm-create-disk-add-select", ), Div( AnyTag( "a", AnyTag( "i", css_class="icon-plus-sign", ), href="#", css_id="vm-create-disk-add-button", css_class="btn btn-success", ), css_class="input-group-btn" ), css_class="input-group", style="max-width: 330px;", ), css_id="vm-create-disk-add", ), css_class="no-js-hidden", ), css_class="col-sm-8", style="padding-top: 3px;", ), css_class="row", ), # end of disks Div( # network Div( AnyTag( "h2", HTML(_("Network")), ), css_class="col-sm-4", ), Div( Div( # js-hidden Field( "networks", css_class="form-control", id="vm-create-network-add-vlan", ), css_class="js-hidden", style="padding-top: 15px; max-width: 450px;", ), Div( # no-js-hidden AnyTag( "h3", HTML(_("Not added to any network!")), css_id="vm-create-network-list", ), AnyTag( "h3", Div( AnyTag( "select", css_class=("form-control " "font-awesome-font"), css_id="vm-create-network-add-select", ), Div( AnyTag( "a", AnyTag( "i", css_class="icon-plus-sign", ), css_id=("vm-create-network-add" "-button"), css_class="btn btn-success", ), css_class="input-group-btn", ), css_class="input-group", style="max-width: 330px;", ), css_class="vm-create-network-add" ), css_class="no-js-hidden", ), css_class="col-sm-8", style="padding-top: 3px;", ), css_class="row" ), # end of network ) class HostForm(forms.ModelForm): def setowner(self, user): self.instance.owner = user def __init__(self, *args, **kwargs): super(HostForm, self).__init__(*args, **kwargs) self.helper = FormHelper(self) self.helper.form_show_labels = False self.helper.form_tag = False self.helper.layout = Layout( Div( Div( # host Div( AnyTag( 'h3', HTML(_("Host")), ), css_class="col-sm-3", ), css_class="row", ), Div( # host data Div( # hostname HTML(''), css_class="col-sm-3", ), Div( # hostname 'hostname', css_class="col-sm-9", ), Div( # mac HTML(''), css_class="col-sm-3", ), Div( 'mac', css_class="col-sm-9", ), Div( # ip HTML(''), css_class="col-sm-3", ), Div( 'ipv4', css_class="col-sm-9", ), Div( # vlan HTML(''), css_class="col-sm-3", ), Div( 'vlan', css_class="col-sm-9", ), css_class="row", ), ), ) class Meta: model = Host fields = ['hostname', 'vlan', 'mac', 'ipv4', ] class NodeForm(forms.ModelForm): def __init__(self, *args, **kwargs): super(NodeForm, self).__init__(*args, **kwargs) self.helper = FormHelper(self) self.helper.form_show_labels = False self.helper.layout = Layout( Div( Div( Div( Div( AnyTag( 'h3', HTML(_("Node")), ), css_class="col-sm-3", ), css_class="row", ), Div( Div( # nodename HTML(''), css_class="col-sm-3", ), Div( 'name', css_class="col-sm-9", ), css_class="row", ), Div( Div( # priority HTML(''), css_class="col-sm-3", ), Div( 'priority', css_class="col-sm-9", ), css_class="row", ), Div( Div( # enabled HTML(''), css_class="col-sm-3", ), Div( 'enabled', css_class="col-sm-9", ), css_class="row", ), Div( # nested host HTML("""{% load crispy_forms_tags %} {% crispy hostform %} """) ), Div( Div( AnyTag( # tip: don't try to use Button class "button", AnyTag( "i", css_class="icon-play" ), HTML("Start"), css_id="node-create-submit", css_class="btn btn-success", ), css_class="col-sm-12 text-right", ), css_class="row", ), css_class="col-sm-11", ), css_class="row", ), ) class Meta: model = Node fields = ['name', 'priority', 'enabled', ] class TemplateForm(forms.ModelForm): networks = forms.ModelMultipleChoiceField( queryset=VLANS, required=False) def __init__(self, *args, **kwargs): parent = kwargs.pop("parent", None) self.user = kwargs.pop("user", None) super(TemplateForm, self).__init__(*args, **kwargs) self.fields['disks'] = forms.ModelMultipleChoiceField( queryset=Disk.get_objects_with_level( 'user', self.user).exclude(type="qcow2-snap") ) data = self.data.copy() data['owner'] = self.user.pk self.data = data if parent is not None: template = InstanceTemplate.objects.get(pk=parent) parent = template.__dict__ fields = ["system", "name", "num_cores", "boot_menu", "ram_size", "priority", "access_method", "raw_data", "arch", "description"] for f in fields: self.initial[f] = parent[f] self.initial['lease'] = parent['lease_id'] self.initial['disks'] = template.disks.all() self.initial['parent'] = template self.initial['name'] = "Clone of %s" % self.initial['name'] self.for_networks = template else: self.for_networks = self.instance if self.instance.pk or parent is not None: n = self.for_networks.interface_set.values_list("vlan", flat=True) self.initial['networks'] = n if not self.instance.pk and len(self.errors) < 1: self.instance.priority = 20 self.instance.ram_size = 512 self.instance.num_cores = 2 def clean_owner(self): if self.instance.pk is not None: return User.objects.get(pk=self.instance.owner.pk) return self.user def save(self, commit=True): data = self.cleaned_data self.instance.max_ram_size = data.get('ram_size') instance = super(TemplateForm, self).save(commit=False) if commit: instance.save() self.instance.disks = data['disks'] # TODO why do I need this # create and/or delete InterfaceTemplates networks = InterfaceTemplate.objects.filter( template=self.instance).values_list("vlan", flat=True) for m in data['networks']: if m.pk not in networks: InterfaceTemplate(vlan=m, managed=m.managed, template=self.instance).save() InterfaceTemplate.objects.filter( template=self.instance).exclude( vlan__in=data['networks']).delete() return instance @property def helper(self): helper = FormHelper() helper.layout = Layout( Field("name"), Fieldset( _("Resource configuration"), Div( # cpu count Div( Field('num_cores', id="vm-cpu-count-slider", css_class="vm-slider", data_slider_min="1", data_slider_max="8", data_slider_step="1", data_slider_value=self.instance.num_cores, data_slider_handle="square", data_slider_tooltip="hide"), css_class="col-sm-9" ), css_class="row" ), Div( # cpu priority Div( Field('priority', id="vm-cpu-priority-slider", css_class="vm-slider", data_slider_min="0", data_slider_max="100", data_slider_step="1", data_slider_value=self.instance.priority, data_slider_handle="square", data_slider_tooltip="hide"), css_class="col-sm-9" ), css_class="row" ), Div( Div( Field('ram_size', id="vm-ram-size-slider", css_class="vm-slider", data_slider_min="128", data_slider_max="4096", data_slider_step="128", data_slider_value=self.instance.ram_size, data_slider_handle="square", data_slider_tooltip="hide"), css_class="col-sm-9" ), css_class="row", ), Field('max_ram_size', type="hidden", value="0"), Field('arch'), ), Fieldset( "stuff", Field('access_method'), Field('boot_menu'), Field('raw_data'), Field('req_traits'), Field('description'), Field("parent", type="hidden"), Field("system"), ), Fieldset( _("Exeternal"), Field("disks"), Field("networks"), Field("lease"), Field("tags"), ), ) helper.add_input(Submit('submit', 'Save changes')) return helper class Meta: model = InstanceTemplate exclude = ('state', ) class LeaseForm(forms.ModelForm): def __init__(self, *args, **kwargs): super(LeaseForm, self).__init__(*args, **kwargs) self.generate_fields() # e2ae8b048e7198428f696375b8bdcd89e90002d1/django/utils/timesince.py#L10 def get_intervals(self, delta_seconds): chunks = ( (60 * 60 * 24 * 30, "months"), (60 * 60 * 24 * 7, "weeks"), (60 * 60 * 24, "days"), (60 * 60, "hours"), ) for i, (seconds, name) in enumerate(chunks): count = delta_seconds // seconds if count != 0: break re = {'%s' % name: count} if i + 1 < len(chunks) and i > 0: seconds2, name2 = chunks[i + 1] count2 = (delta_seconds - (seconds * count)) // seconds2 if count2 != 0: re['%s' % name2] = count2 return re def generate_fields(self): intervals = ["hours", "days", "weeks", "months"] methods = ["suspend", "delete"] # feels redundant but these lines are so long s = (self.instance.suspend_interval.total_seconds() if self.instance.pk else 0) d = (self.instance.delete_interval.total_seconds() if self.instance.pk else 0) seconds = { 'suspend': s, 'delete': d } initial = { 'suspend': self.get_intervals(int(seconds['suspend'])), 'delete': self.get_intervals(int(seconds['delete'])) } for m in methods: for idx, i in enumerate(intervals): self.fields["%s_%s" % (m, i)] = forms.IntegerField( min_value=0, widget=NumberInput, initial=initial[m].get(i, 0)) def save(self, commit=True): data = self.cleaned_data suspend_seconds = timedelta( hours=data['suspend_hours'], days=(data['suspend_days'] + data['suspend_months'] % 12 * 30 + data['suspend_months'] / 12 * 365), weeks=data['suspend_weeks'], ) delete_seconds = timedelta( hours=data['delete_hours'], days=(data['delete_days'] + data['delete_months'] % 12 * 30 + data['delete_months'] / 12 * 365), weeks=data['delete_weeks'], ) self.instance.delete_interval = delete_seconds self.instance.suspend_interval = suspend_seconds instance = super(LeaseForm, self).save(commit=False) if commit: instance.save() return instance @property def helper(self): helper = FormHelper() helper.layout = Layout( Field('name'), Field("suspend_interval_seconds", type="hidden", value="0"), Field("delete_interval_seconds", type="hidden", value="0"), Div( Div( HTML(_("Suspend in")), css_class="input-group-addon", style="width: 100px;", ), NumberField("suspend_hours", css_class="form-control"), Div( HTML(_("hours")), css_class="input-group-addon", ), NumberField("suspend_days", css_class="form-control"), Div( HTML(_("days")), css_class="input-group-addon", ), NumberField("suspend_weeks", css_class="form-control"), Div( HTML(_("weeks")), css_class="input-group-addon", ), NumberField("suspend_months", css_class="form-control"), Div( HTML(_("months")), css_class="input-group-addon", ), css_class="input-group interval-input", ), Div( Div( HTML(_("Delete in")), css_class="input-group-addon", style="width: 100px;", ), NumberField("delete_hours", css_class="form-control"), Div( HTML(_("hours")), css_class="input-group-addon", ), NumberField("delete_days", css_class="form-control"), Div( HTML(_("days")), css_class="input-group-addon", ), NumberField("delete_weeks", css_class="form-control"), Div( HTML(_("weeks")), css_class="input-group-addon", ), NumberField("delete_months", css_class="form-control"), Div( HTML(_("months")), css_class="input-group-addon", ), css_class="input-group interval-input", ) ) helper.add_input(Submit("submit", "Save changes")) return helper class Meta: model = Lease class DiskAddForm(forms.Form): name = forms.CharField() size = forms.CharField(widget=FileSizeWidget) def clean_size(self): size_in_bytes = self.cleaned_data.get("size") if not size_in_bytes.isdigit(): raise forms.ValidationError(_("Invalid format, you can use " " GB or MB!")) return size_in_bytes def save(self, vm, commit=True): data = self.cleaned_data d = Disk( name=data['name'], filename=str(uuid.uuid4()), datastore=DataStore.objects.all()[0], type="qcow2-norm", size=data['size'], dev_num="a", ) d.save() vm.disks.add(d) return d @property def helper(self): helper = FormHelper() helper.form_show_labels = False helper.layout = Layout( Field("name", placeholder=_("Name")), Field("size", placeholder=_("Disk size (for example: 20GB, " "1500MB)")), ) helper.add_input(Submit("submit", "Create new disk", css_class="btn btn-success")) return helper class LinkButton(BaseInput): """ Used to create a link button descriptor for the {% crispy %} template tag:: back = LinkButton('back', 'Back', reverse_lazy('index')) .. note:: The first argument is also slugified and turned into the id for the submit button. """ template = "bootstrap/layout/linkbutton.html" field_classes = 'btn btn-default' def __init__(self, name, text, url, *args, **kwargs): self.href = url super(LinkButton, self).__init__(name, text, *args, **kwargs) class NumberInput(TextInput): input_type = "number" class NumberField(Field): template = "crispy_forms/numberfield.html" def __init__(self, *args, **kwargs): kwargs['min'] = 0 super(NumberField, self).__init__(*args, **kwargs) class AnyTag(Div): template = "crispy_forms/anytag.html" def __init__(self, tag, *fields, **kwargs): self.tag = tag super(AnyTag, self).__init__(*fields, **kwargs) def render(self, form, form_style, context, template_pack=TEMPLATE_PACK): fields = '' for field in self.fields: fields += render_field(field, form, form_style, context, template_pack=template_pack) return render_to_string(self.template, Context({'tag': self, 'fields': fields})) class WorkingBaseInput(BaseInput): def __init__(self, name, value, input_type="text", **kwargs): self.input_type = input_type self.field_classes = "" # we need this for some reason super(WorkingBaseInput, self).__init__(name, value, **kwargs) migrations/ 0000775 0000000 0000000 00000000000 12304627050 0032002 5 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/dashboard 0001_initial.py 0000664 0000000 0000000 00000047670 12304627050 0034463 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/dashboard/migrations # -*- coding: utf-8 -*- import 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 'Favourite' db.create_table(u'dashboard_favourite', ( (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), ('instance', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['vm.Instance'])), ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), )) db.send_create_signal(u'dashboard', ['Favourite']) def backwards(self, orm): # Deleting model 'Favourite' db.delete_table(u'dashboard_favourite') models = { u'acl.level': { 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Level'}, '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'}), 'weight': ('django.db.models.fields.IntegerField', [], {'null': 'True'}) }, u'acl.objectlevel': { 'Meta': {'unique_together': "(('content_type', 'object_id', 'level'),)", 'object_name': 'ObjectLevel'}, 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'level': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['acl.Level']"}), 'object_id': ('django.db.models.fields.IntegerField', [], {}), 'users': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.User']", 'symmetrical': 'False'}) }, 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', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), 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', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) }, 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'dashboard.favourite': { 'Meta': {'object_name': 'Favourite'}, u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'instance': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['vm.Instance']"}), 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) }, u'firewall.domain': { 'Meta': {'object_name': 'Domain'}, 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'max_length': '40'}), 'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}), 'ttl': ('django.db.models.fields.IntegerField', [], {'default': '600'}) }, u'firewall.group': { 'Meta': {'object_name': 'Group'}, 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20'}), 'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'}) }, u'firewall.host': { 'Meta': {'object_name': 'Host'}, 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['firewall.Group']", 'null': 'True', 'blank': 'True'}), 'hostname': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'ipv4': ('firewall.fields.IPAddressField', [], {'unique': 'True', 'max_length': '100'}), 'ipv6': ('firewall.fields.IPAddressField', [], {'max_length': '100', 'unique': 'True', 'null': 'True', 'blank': 'True'}), 'location': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'mac': ('firewall.fields.MACAddressField', [], {'unique': 'True', 'max_length': '17'}), 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), 'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}), 'pub_ipv4': ('firewall.fields.IPAddressField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), 'reverse': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}), 'shared_ip': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'vlan': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['firewall.Vlan']"}) }, u'firewall.vlan': { 'Meta': {'object_name': 'Vlan'}, 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'dhcp_pool': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['firewall.Domain']"}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20'}), 'network4': ('firewall.fields.IPNetworkField', [], {'max_length': '100'}), 'network6': ('firewall.fields.IPNetworkField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), 'network_type': ('django.db.models.fields.CharField', [], {'max_length': '20'}), 'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'}), 'reverse_domain': ('django.db.models.fields.TextField', [], {'default': "'%(d)d.%(c)d.%(b)d.%(a)d.in-addr.arpa'"}), 'snat_ip': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39', 'null': 'True', 'blank': 'True'}), 'snat_to': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['firewall.Vlan']", 'null': 'True', 'blank': 'True'}), 'vid': ('django.db.models.fields.IntegerField', [], {'unique': 'True'}) }, u'storage.datastore': { 'Meta': {'ordering': "['name']", 'object_name': 'DataStore'}, 'hostname': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), 'path': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '200'}) }, u'storage.disk': { 'Meta': {'ordering': "['name']", 'object_name': 'Disk'}, 'base': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'derivatives'", 'null': 'True', 'to': u"orm['storage.Disk']"}), 'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}), 'datastore': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['storage.DataStore']"}), 'destroyed': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), 'dev_num': ('django.db.models.fields.CharField', [], {'default': "'a'", 'max_length': '1'}), 'filename': ('django.db.models.fields.CharField', [], {'max_length': '256'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}), 'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), 'ready': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'size': ('sizefield.models.FileSizeField', [], {}), 'type': ('django.db.models.fields.CharField', [], {'max_length': '10'}) }, u'taggit.tag': { 'Meta': {'object_name': 'Tag'}, u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '100'}) }, u'taggit.taggeditem': { 'Meta': {'object_name': 'TaggedItem'}, 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'taggit_taggeditem_tagged_items'", 'to': u"orm['contenttypes.ContentType']"}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'object_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}), 'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'taggit_taggeditem_items'", 'to': u"orm['taggit.Tag']"}) }, u'vm.instance': { 'Meta': {'ordering': "[u'pk']", 'object_name': 'Instance'}, 'access_method': ('django.db.models.fields.CharField', [], {'max_length': '10'}), 'active_since': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), 'arch': ('django.db.models.fields.CharField', [], {'max_length': '10'}), 'boot_menu': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}), 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'destroyed': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), 'disks': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "u'instance_set'", 'symmetrical': 'False', 'to': u"orm['storage.Disk']"}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'lease': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['vm.Lease']"}), 'max_ram_size': ('django.db.models.fields.IntegerField', [], {}), 'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}), 'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), 'node': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'instance_set'", 'null': 'True', 'to': u"orm['vm.Node']"}), 'num_cores': ('django.db.models.fields.IntegerField', [], {}), 'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}), 'priority': ('django.db.models.fields.IntegerField', [], {}), 'pw': ('django.db.models.fields.CharField', [], {'max_length': '20'}), 'ram_size': ('django.db.models.fields.IntegerField', [], {}), 'raw_data': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'req_traits': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['vm.Trait']", 'symmetrical': 'False', 'blank': 'True'}), 'state': ('django.db.models.fields.CharField', [], {'default': "u'NOSTATE'", 'max_length': '20'}), 'template': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'instance_set'", 'null': 'True', 'to': u"orm['vm.InstanceTemplate']"}), 'time_of_delete': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), 'time_of_suspend': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), 'vnc_port': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'unique': 'True', 'null': 'True', 'blank': 'True'}) }, u'vm.instancetemplate': { 'Meta': {'ordering': "[u'name']", 'object_name': 'InstanceTemplate'}, 'access_method': ('django.db.models.fields.CharField', [], {'max_length': '10'}), 'arch': ('django.db.models.fields.CharField', [], {'max_length': '10'}), 'boot_menu': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}), 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'disks': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "u'template_set'", 'symmetrical': 'False', 'to': u"orm['storage.Disk']"}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'lease': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['vm.Lease']"}), 'max_ram_size': ('django.db.models.fields.IntegerField', [], {}), 'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), 'num_cores': ('django.db.models.fields.IntegerField', [], {}), 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['vm.InstanceTemplate']", 'null': 'True', 'blank': 'True'}), 'priority': ('django.db.models.fields.IntegerField', [], {}), 'ram_size': ('django.db.models.fields.IntegerField', [], {}), 'raw_data': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'req_traits': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['vm.Trait']", 'symmetrical': 'False', 'blank': 'True'}), 'state': ('django.db.models.fields.CharField', [], {'default': "u'NEW'", 'max_length': '10'}), 'system': ('django.db.models.fields.TextField', [], {'blank': 'True'}) }, u'vm.lease': { 'Meta': {'ordering': "[u'name']", 'object_name': 'Lease'}, 'delete_interval_seconds': ('django.db.models.fields.IntegerField', [], {}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), 'suspend_interval_seconds': ('django.db.models.fields.IntegerField', [], {}) }, u'vm.node': { 'Meta': {'object_name': 'Node'}, 'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}), 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'host': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['firewall.Host']"}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '50'}), 'overcommit': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), 'priority': ('django.db.models.fields.IntegerField', [], {}), 'traits': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['vm.Trait']", 'symmetrical': 'False', 'blank': 'True'}) }, u'vm.trait': { 'Meta': {'object_name': 'Trait'}, u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) } } complete_apps = ['dashboard'] 0002_auto__add_profile.py 0000664 0000000 0000000 00000051644 12304627050 0036466 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/dashboard/migrations # -*- coding: utf-8 -*- import 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 'Profile' db.create_table(u'dashboard_profile', ( (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), ('user', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['auth.User'], unique=True)), ('preferred_language', self.gf('django.db.models.fields.CharField')(default='en-us', max_length=32)), ('org_id', self.gf('django.db.models.fields.CharField')(max_length=64, unique=True, null=True, blank=True)), )) db.send_create_signal(u'dashboard', ['Profile']) def backwards(self, orm): # Deleting model 'Profile' db.delete_table(u'dashboard_profile') models = { u'acl.level': { 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Level'}, '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'}), 'weight': ('django.db.models.fields.IntegerField', [], {'null': 'True'}) }, u'acl.objectlevel': { 'Meta': {'unique_together': "(('content_type', 'object_id', 'level'),)", 'object_name': 'ObjectLevel'}, 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'level': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['acl.Level']"}), 'object_id': ('django.db.models.fields.IntegerField', [], {}), 'users': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.User']", 'symmetrical': 'False'}) }, 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', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), 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', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) }, 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'dashboard.favourite': { 'Meta': {'object_name': 'Favourite'}, u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'instance': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['vm.Instance']"}), 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) }, u'dashboard.profile': { 'Meta': {'object_name': 'Profile'}, u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'org_id': ('django.db.models.fields.CharField', [], {'max_length': '64', 'unique': 'True', 'null': 'True', 'blank': 'True'}), 'preferred_language': ('django.db.models.fields.CharField', [], {'default': "'en-us'", 'max_length': '32'}), 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['auth.User']", 'unique': 'True'}) }, u'firewall.domain': { 'Meta': {'object_name': 'Domain'}, 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'max_length': '40'}), 'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}), 'ttl': ('django.db.models.fields.IntegerField', [], {'default': '600'}) }, u'firewall.group': { 'Meta': {'object_name': 'Group'}, 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20'}), 'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'}) }, u'firewall.host': { 'Meta': {'unique_together': "(('hostname', 'vlan'),)", 'object_name': 'Host'}, 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['firewall.Group']", 'null': 'True', 'blank': 'True'}), 'hostname': ('django.db.models.fields.CharField', [], {'max_length': '40'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'ipv4': ('firewall.fields.IPAddressField', [], {'unique': 'True', 'max_length': '100'}), 'ipv6': ('firewall.fields.IPAddressField', [], {'max_length': '100', 'unique': 'True', 'null': 'True', 'blank': 'True'}), 'location': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'mac': ('firewall.fields.MACAddressField', [], {'unique': 'True', 'max_length': '17'}), 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), 'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}), 'pub_ipv4': ('firewall.fields.IPAddressField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), 'reverse': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}), 'shared_ip': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'vlan': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['firewall.Vlan']"}) }, u'firewall.vlan': { 'Meta': {'object_name': 'Vlan'}, 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'dhcp_pool': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['firewall.Domain']"}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'ipv6_template': ('django.db.models.fields.TextField', [], {'default': "'2001:738:2001:4031:%(b)d:%(c)d:%(d)d:0'"}), 'managed': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20'}), 'network4': ('firewall.fields.IPNetworkField', [], {'max_length': '100'}), 'network6': ('firewall.fields.IPNetworkField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), 'network_type': ('django.db.models.fields.CharField', [], {'max_length': '20'}), 'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'}), 'reverse_domain': ('django.db.models.fields.TextField', [], {'default': "'%(d)d.%(c)d.%(b)d.%(a)d.in-addr.arpa'"}), 'snat_ip': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39', 'null': 'True', 'blank': 'True'}), 'snat_to': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['firewall.Vlan']", 'null': 'True', 'blank': 'True'}), 'vid': ('django.db.models.fields.IntegerField', [], {'unique': 'True'}) }, u'storage.datastore': { 'Meta': {'ordering': "['name']", 'object_name': 'DataStore'}, 'hostname': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), 'path': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '200'}) }, u'storage.disk': { 'Meta': {'ordering': "['name']", 'object_name': 'Disk'}, 'base': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'derivatives'", 'null': 'True', 'to': u"orm['storage.Disk']"}), 'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}), 'datastore': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['storage.DataStore']"}), 'destroyed': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), 'dev_num': ('django.db.models.fields.CharField', [], {'default': "'a'", 'max_length': '1'}), 'filename': ('django.db.models.fields.CharField', [], {'max_length': '256'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}), 'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), 'ready': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'size': ('sizefield.models.FileSizeField', [], {}), 'type': ('django.db.models.fields.CharField', [], {'max_length': '10'}) }, u'taggit.tag': { 'Meta': {'object_name': 'Tag'}, u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '100'}) }, u'taggit.taggeditem': { 'Meta': {'object_name': 'TaggedItem'}, 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'taggit_taggeditem_tagged_items'", 'to': u"orm['contenttypes.ContentType']"}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'object_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}), 'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'taggit_taggeditem_items'", 'to': u"orm['taggit.Tag']"}) }, u'vm.instance': { 'Meta': {'ordering': "[u'pk']", 'object_name': 'Instance'}, 'access_method': ('django.db.models.fields.CharField', [], {'max_length': '10'}), 'active_since': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), 'arch': ('django.db.models.fields.CharField', [], {'max_length': '10'}), 'boot_menu': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}), 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'destroyed': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), 'disks': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "u'instance_set'", 'symmetrical': 'False', 'to': u"orm['storage.Disk']"}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'lease': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['vm.Lease']"}), 'max_ram_size': ('django.db.models.fields.IntegerField', [], {}), 'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}), 'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), 'node': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'instance_set'", 'null': 'True', 'to': u"orm['vm.Node']"}), 'num_cores': ('django.db.models.fields.IntegerField', [], {}), 'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}), 'priority': ('django.db.models.fields.IntegerField', [], {}), 'pw': ('django.db.models.fields.CharField', [], {'max_length': '20'}), 'ram_size': ('django.db.models.fields.IntegerField', [], {}), 'raw_data': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'req_traits': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['vm.Trait']", 'symmetrical': 'False', 'blank': 'True'}), 'state': ('django.db.models.fields.CharField', [], {'default': "u'NOSTATE'", 'max_length': '20'}), 'template': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'instance_set'", 'null': 'True', 'to': u"orm['vm.InstanceTemplate']"}), 'time_of_delete': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), 'time_of_suspend': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), 'vnc_port': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'unique': 'True', 'null': 'True', 'blank': 'True'}) }, u'vm.instancetemplate': { 'Meta': {'ordering': "[u'name']", 'object_name': 'InstanceTemplate'}, 'access_method': ('django.db.models.fields.CharField', [], {'max_length': '10'}), 'arch': ('django.db.models.fields.CharField', [], {'max_length': '10'}), 'boot_menu': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}), 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'disks': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "u'template_set'", 'symmetrical': 'False', 'to': u"orm['storage.Disk']"}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'lease': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['vm.Lease']"}), 'max_ram_size': ('django.db.models.fields.IntegerField', [], {}), 'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), 'num_cores': ('django.db.models.fields.IntegerField', [], {}), 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['vm.InstanceTemplate']", 'null': 'True', 'blank': 'True'}), 'priority': ('django.db.models.fields.IntegerField', [], {}), 'ram_size': ('django.db.models.fields.IntegerField', [], {}), 'raw_data': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'req_traits': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['vm.Trait']", 'symmetrical': 'False', 'blank': 'True'}), 'state': ('django.db.models.fields.CharField', [], {'default': "u'NEW'", 'max_length': '10'}), 'system': ('django.db.models.fields.TextField', [], {'blank': 'True'}) }, u'vm.lease': { 'Meta': {'ordering': "[u'name']", 'object_name': 'Lease'}, 'delete_interval_seconds': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), 'suspend_interval_seconds': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) }, u'vm.node': { 'Meta': {'object_name': 'Node'}, 'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}), 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'host': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['firewall.Host']"}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '50'}), 'overcommit': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), 'priority': ('django.db.models.fields.IntegerField', [], {}), 'traits': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['vm.Trait']", 'symmetrical': 'False', 'blank': 'True'}) }, u'vm.trait': { 'Meta': {'object_name': 'Trait'}, u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) } } complete_apps = ['dashboard'] 0003_auto__add_field_profile_instance_limit.py 0000664 0000000 0000000 00000051307 12304627050 0042710 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/dashboard/migrations # -*- coding: utf-8 -*- import datetime from south.db import db from south.v2 import SchemaMigration from django.db import models class Migration(SchemaMigration): def forwards(self, orm): # Adding field 'Profile.instance_limit' db.add_column(u'dashboard_profile', 'instance_limit', self.gf('django.db.models.fields.IntegerField')(default=5), keep_default=False) def backwards(self, orm): # Deleting field 'Profile.instance_limit' db.delete_column(u'dashboard_profile', 'instance_limit') models = { u'acl.level': { 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Level'}, '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'}), 'weight': ('django.db.models.fields.IntegerField', [], {'null': 'True'}) }, u'acl.objectlevel': { 'Meta': {'unique_together': "(('content_type', 'object_id', 'level'),)", 'object_name': 'ObjectLevel'}, 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'level': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['acl.Level']"}), 'object_id': ('django.db.models.fields.IntegerField', [], {}), 'users': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.User']", 'symmetrical': 'False'}) }, 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', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), 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', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) }, 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'dashboard.favourite': { 'Meta': {'object_name': 'Favourite'}, u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'instance': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['vm.Instance']"}), 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) }, u'dashboard.profile': { 'Meta': {'object_name': 'Profile'}, u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'instance_limit': ('django.db.models.fields.IntegerField', [], {'default': '5'}), 'org_id': ('django.db.models.fields.CharField', [], {'max_length': '64', 'unique': 'True', 'null': 'True', 'blank': 'True'}), 'preferred_language': ('django.db.models.fields.CharField', [], {'default': "'en-us'", 'max_length': '32'}), 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['auth.User']", 'unique': 'True'}) }, u'firewall.domain': { 'Meta': {'object_name': 'Domain'}, 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'max_length': '40'}), 'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}), 'ttl': ('django.db.models.fields.IntegerField', [], {'default': '600'}) }, u'firewall.group': { 'Meta': {'object_name': 'Group'}, 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20'}), 'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'}) }, u'firewall.host': { 'Meta': {'unique_together': "(('hostname', 'vlan'),)", 'object_name': 'Host'}, 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['firewall.Group']", 'null': 'True', 'blank': 'True'}), 'hostname': ('django.db.models.fields.CharField', [], {'max_length': '40'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'ipv4': ('firewall.fields.IPAddressField', [], {'unique': 'True', 'max_length': '100'}), 'ipv6': ('firewall.fields.IPAddressField', [], {'max_length': '100', 'unique': 'True', 'null': 'True', 'blank': 'True'}), 'location': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'mac': ('firewall.fields.MACAddressField', [], {'unique': 'True', 'max_length': '17'}), 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), 'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}), 'pub_ipv4': ('firewall.fields.IPAddressField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), 'reverse': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}), 'shared_ip': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'vlan': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['firewall.Vlan']"}) }, u'firewall.vlan': { 'Meta': {'object_name': 'Vlan'}, 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'dhcp_pool': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['firewall.Domain']"}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'ipv6_template': ('django.db.models.fields.TextField', [], {'default': "'2001:738:2001:4031:%(b)d:%(c)d:%(d)d:0'"}), 'managed': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20'}), 'network4': ('firewall.fields.IPNetworkField', [], {'max_length': '100'}), 'network6': ('firewall.fields.IPNetworkField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), 'network_type': ('django.db.models.fields.CharField', [], {'max_length': '20'}), 'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'}), 'reverse_domain': ('django.db.models.fields.TextField', [], {'default': "'%(d)d.%(c)d.%(b)d.%(a)d.in-addr.arpa'"}), 'snat_ip': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39', 'null': 'True', 'blank': 'True'}), 'snat_to': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['firewall.Vlan']", 'null': 'True', 'blank': 'True'}), 'vid': ('django.db.models.fields.IntegerField', [], {'unique': 'True'}) }, u'storage.datastore': { 'Meta': {'ordering': "['name']", 'object_name': 'DataStore'}, 'hostname': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), 'path': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '200'}) }, u'storage.disk': { 'Meta': {'ordering': "['name']", 'object_name': 'Disk'}, 'base': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'derivatives'", 'null': 'True', 'to': u"orm['storage.Disk']"}), 'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}), 'datastore': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['storage.DataStore']"}), 'destroyed': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), 'dev_num': ('django.db.models.fields.CharField', [], {'default': "'a'", 'max_length': '1'}), 'filename': ('django.db.models.fields.CharField', [], {'max_length': '256'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}), 'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), 'ready': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'size': ('sizefield.models.FileSizeField', [], {}), 'type': ('django.db.models.fields.CharField', [], {'max_length': '10'}) }, u'taggit.tag': { 'Meta': {'object_name': 'Tag'}, u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '100'}) }, u'taggit.taggeditem': { 'Meta': {'object_name': 'TaggedItem'}, 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'taggit_taggeditem_tagged_items'", 'to': u"orm['contenttypes.ContentType']"}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'object_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}), 'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'taggit_taggeditem_items'", 'to': u"orm['taggit.Tag']"}) }, u'vm.instance': { 'Meta': {'ordering': "[u'pk']", 'object_name': 'Instance'}, 'access_method': ('django.db.models.fields.CharField', [], {'max_length': '10'}), 'active_since': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), 'arch': ('django.db.models.fields.CharField', [], {'max_length': '10'}), 'boot_menu': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}), 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'destroyed': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), 'disks': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "u'instance_set'", 'symmetrical': 'False', 'to': u"orm['storage.Disk']"}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'lease': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['vm.Lease']"}), 'max_ram_size': ('django.db.models.fields.IntegerField', [], {}), 'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}), 'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), 'node': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'instance_set'", 'null': 'True', 'to': u"orm['vm.Node']"}), 'num_cores': ('django.db.models.fields.IntegerField', [], {}), 'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}), 'priority': ('django.db.models.fields.IntegerField', [], {}), 'pw': ('django.db.models.fields.CharField', [], {'max_length': '20'}), 'ram_size': ('django.db.models.fields.IntegerField', [], {}), 'raw_data': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'req_traits': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['vm.Trait']", 'symmetrical': 'False', 'blank': 'True'}), 'state': ('django.db.models.fields.CharField', [], {'default': "u'NOSTATE'", 'max_length': '20'}), 'template': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'instance_set'", 'null': 'True', 'to': u"orm['vm.InstanceTemplate']"}), 'time_of_delete': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), 'time_of_suspend': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), 'vnc_port': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'unique': 'True', 'null': 'True', 'blank': 'True'}) }, u'vm.instancetemplate': { 'Meta': {'ordering': "[u'name']", 'object_name': 'InstanceTemplate'}, 'access_method': ('django.db.models.fields.CharField', [], {'max_length': '10'}), 'arch': ('django.db.models.fields.CharField', [], {'max_length': '10'}), 'boot_menu': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}), 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'disks': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "u'template_set'", 'symmetrical': 'False', 'to': u"orm['storage.Disk']"}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'lease': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['vm.Lease']"}), 'max_ram_size': ('django.db.models.fields.IntegerField', [], {}), 'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), 'num_cores': ('django.db.models.fields.IntegerField', [], {}), 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['vm.InstanceTemplate']", 'null': 'True', 'blank': 'True'}), 'priority': ('django.db.models.fields.IntegerField', [], {}), 'ram_size': ('django.db.models.fields.IntegerField', [], {}), 'raw_data': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'req_traits': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['vm.Trait']", 'symmetrical': 'False', 'blank': 'True'}), 'state': ('django.db.models.fields.CharField', [], {'default': "u'NEW'", 'max_length': '10'}), 'system': ('django.db.models.fields.TextField', [], {'blank': 'True'}) }, u'vm.lease': { 'Meta': {'ordering': "[u'name']", 'object_name': 'Lease'}, 'delete_interval_seconds': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), 'suspend_interval_seconds': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) }, u'vm.node': { 'Meta': {'object_name': 'Node'}, 'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}), 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'host': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['firewall.Host']"}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '50'}), 'overcommit': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), 'priority': ('django.db.models.fields.IntegerField', [], {}), 'traits': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['vm.Trait']", 'symmetrical': 'False', 'blank': 'True'}) }, u'vm.trait': { 'Meta': {'object_name': 'Trait'}, u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) } } complete_apps = ['dashboard'] 0004_auto__add_groupprofile.py 0000664 0000000 0000000 00000053003 12304627050 0037534 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/dashboard/migrations # -*- coding: utf-8 -*- import 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 'GroupProfile' db.create_table(u'dashboard_groupprofile', ( (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), ('group', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['auth.Group'], unique=True)), ('org_id', self.gf('django.db.models.fields.CharField')(max_length=64, unique=True, null=True, blank=True)), ('description', self.gf('django.db.models.fields.TextField')()), )) db.send_create_signal(u'dashboard', ['GroupProfile']) def backwards(self, orm): # Deleting model 'GroupProfile' db.delete_table(u'dashboard_groupprofile') models = { u'acl.level': { 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Level'}, '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'}), 'weight': ('django.db.models.fields.IntegerField', [], {'null': 'True'}) }, u'acl.objectlevel': { 'Meta': {'unique_together': "(('content_type', 'object_id', 'level'),)", 'object_name': 'ObjectLevel'}, 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'level': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['acl.Level']"}), 'object_id': ('django.db.models.fields.IntegerField', [], {}), 'users': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.User']", 'symmetrical': 'False'}) }, 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', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), 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', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) }, 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'dashboard.favourite': { 'Meta': {'object_name': 'Favourite'}, u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'instance': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['vm.Instance']"}), 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) }, u'dashboard.groupprofile': { 'Meta': {'object_name': 'GroupProfile'}, 'description': ('django.db.models.fields.TextField', [], {}), 'group': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['auth.Group']", 'unique': 'True'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'org_id': ('django.db.models.fields.CharField', [], {'max_length': '64', 'unique': 'True', 'null': 'True', 'blank': 'True'}) }, u'dashboard.profile': { 'Meta': {'object_name': 'Profile'}, u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'instance_limit': ('django.db.models.fields.IntegerField', [], {'default': '5'}), 'org_id': ('django.db.models.fields.CharField', [], {'max_length': '64', 'unique': 'True', 'null': 'True', 'blank': 'True'}), 'preferred_language': ('django.db.models.fields.CharField', [], {'default': "'en-us'", 'max_length': '32'}), 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['auth.User']", 'unique': 'True'}) }, u'firewall.domain': { 'Meta': {'object_name': 'Domain'}, 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'max_length': '40'}), 'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}), 'ttl': ('django.db.models.fields.IntegerField', [], {'default': '600'}) }, u'firewall.group': { 'Meta': {'object_name': 'Group'}, 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20'}), 'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'}) }, u'firewall.host': { 'Meta': {'unique_together': "(('hostname', 'vlan'),)", 'object_name': 'Host'}, 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['firewall.Group']", 'null': 'True', 'blank': 'True'}), 'hostname': ('django.db.models.fields.CharField', [], {'max_length': '40'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'ipv4': ('firewall.fields.IPAddressField', [], {'unique': 'True', 'max_length': '100'}), 'ipv6': ('firewall.fields.IPAddressField', [], {'max_length': '100', 'unique': 'True', 'null': 'True', 'blank': 'True'}), 'location': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'mac': ('firewall.fields.MACAddressField', [], {'unique': 'True', 'max_length': '17'}), 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), 'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}), 'pub_ipv4': ('firewall.fields.IPAddressField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), 'reverse': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}), 'shared_ip': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'vlan': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['firewall.Vlan']"}) }, u'firewall.vlan': { 'Meta': {'object_name': 'Vlan'}, 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'dhcp_pool': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['firewall.Domain']"}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'ipv6_template': ('django.db.models.fields.TextField', [], {'default': "'2001:738:2001:4031:%(b)d:%(c)d:%(d)d:0'"}), 'managed': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20'}), 'network4': ('firewall.fields.IPNetworkField', [], {'max_length': '100'}), 'network6': ('firewall.fields.IPNetworkField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), 'network_type': ('django.db.models.fields.CharField', [], {'max_length': '20'}), 'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'}), 'reverse_domain': ('django.db.models.fields.TextField', [], {'default': "'%(d)d.%(c)d.%(b)d.%(a)d.in-addr.arpa'"}), 'snat_ip': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39', 'null': 'True', 'blank': 'True'}), 'snat_to': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['firewall.Vlan']", 'null': 'True', 'blank': 'True'}), 'vid': ('django.db.models.fields.IntegerField', [], {'unique': 'True'}) }, u'storage.datastore': { 'Meta': {'ordering': "['name']", 'object_name': 'DataStore'}, 'hostname': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), 'path': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '200'}) }, u'storage.disk': { 'Meta': {'ordering': "['name']", 'object_name': 'Disk'}, 'base': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'derivatives'", 'null': 'True', 'to': u"orm['storage.Disk']"}), 'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}), 'datastore': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['storage.DataStore']"}), 'destroyed': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), 'dev_num': ('django.db.models.fields.CharField', [], {'default': "'a'", 'max_length': '1'}), 'filename': ('django.db.models.fields.CharField', [], {'max_length': '256'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}), 'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), 'ready': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'size': ('sizefield.models.FileSizeField', [], {}), 'type': ('django.db.models.fields.CharField', [], {'max_length': '10'}) }, u'taggit.tag': { 'Meta': {'object_name': 'Tag'}, u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '100'}) }, u'taggit.taggeditem': { 'Meta': {'object_name': 'TaggedItem'}, 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'taggit_taggeditem_tagged_items'", 'to': u"orm['contenttypes.ContentType']"}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'object_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}), 'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'taggit_taggeditem_items'", 'to': u"orm['taggit.Tag']"}) }, u'vm.instance': { 'Meta': {'ordering': "[u'pk']", 'object_name': 'Instance'}, 'access_method': ('django.db.models.fields.CharField', [], {'max_length': '10'}), 'active_since': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), 'arch': ('django.db.models.fields.CharField', [], {'max_length': '10'}), 'boot_menu': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}), 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'destroyed': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), 'disks': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "u'instance_set'", 'symmetrical': 'False', 'to': u"orm['storage.Disk']"}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'lease': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['vm.Lease']"}), 'max_ram_size': ('django.db.models.fields.IntegerField', [], {}), 'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}), 'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), 'node': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'instance_set'", 'null': 'True', 'to': u"orm['vm.Node']"}), 'num_cores': ('django.db.models.fields.IntegerField', [], {}), 'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}), 'priority': ('django.db.models.fields.IntegerField', [], {}), 'pw': ('django.db.models.fields.CharField', [], {'max_length': '20'}), 'ram_size': ('django.db.models.fields.IntegerField', [], {}), 'raw_data': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'req_traits': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['vm.Trait']", 'symmetrical': 'False', 'blank': 'True'}), 'state': ('django.db.models.fields.CharField', [], {'default': "u'NOSTATE'", 'max_length': '20'}), 'template': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'instance_set'", 'null': 'True', 'to': u"orm['vm.InstanceTemplate']"}), 'time_of_delete': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), 'time_of_suspend': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), 'vnc_port': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'unique': 'True', 'null': 'True', 'blank': 'True'}) }, u'vm.instancetemplate': { 'Meta': {'ordering': "[u'name']", 'object_name': 'InstanceTemplate'}, 'access_method': ('django.db.models.fields.CharField', [], {'max_length': '10'}), 'arch': ('django.db.models.fields.CharField', [], {'max_length': '10'}), 'boot_menu': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}), 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'disks': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "u'template_set'", 'symmetrical': 'False', 'to': u"orm['storage.Disk']"}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'lease': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['vm.Lease']"}), 'max_ram_size': ('django.db.models.fields.IntegerField', [], {}), 'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), 'num_cores': ('django.db.models.fields.IntegerField', [], {}), 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['vm.InstanceTemplate']", 'null': 'True', 'blank': 'True'}), 'priority': ('django.db.models.fields.IntegerField', [], {}), 'ram_size': ('django.db.models.fields.IntegerField', [], {}), 'raw_data': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'req_traits': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['vm.Trait']", 'symmetrical': 'False', 'blank': 'True'}), 'state': ('django.db.models.fields.CharField', [], {'default': "u'NEW'", 'max_length': '10'}), 'system': ('django.db.models.fields.TextField', [], {'blank': 'True'}) }, u'vm.lease': { 'Meta': {'ordering': "[u'name']", 'object_name': 'Lease'}, 'delete_interval_seconds': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), 'suspend_interval_seconds': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) }, u'vm.node': { 'Meta': {'object_name': 'Node'}, 'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}), 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'host': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['firewall.Host']"}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '50'}), 'overcommit': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), 'priority': ('django.db.models.fields.IntegerField', [], {}), 'traits': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['vm.Trait']", 'symmetrical': 'False', 'blank': 'True'}) }, u'vm.trait': { 'Meta': {'object_name': 'Trait'}, u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) } } complete_apps = ['dashboard'] 0005_auto__add_notification.py 0000664 0000000 0000000 00000055116 12304627050 0037515 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/dashboard/migrations # -*- coding: utf-8 -*- import 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 'Notification' db.create_table(u'dashboard_notification', ( (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), ('created', self.gf('model_utils.fields.AutoCreatedField')(default=datetime.datetime.now)), ('modified', self.gf('model_utils.fields.AutoLastModifiedField')(default=datetime.datetime.now)), ('status', self.gf('model_utils.fields.StatusField')(default='new', max_length=100, no_check_for_status=True)), ('to', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), ('subject', self.gf('django.db.models.fields.CharField')(max_length=128)), ('message', self.gf('django.db.models.fields.TextField')()), )) db.send_create_signal(u'dashboard', ['Notification']) def backwards(self, orm): # Deleting model 'Notification' db.delete_table(u'dashboard_notification') models = { u'acl.level': { 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Level'}, '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'}), 'weight': ('django.db.models.fields.IntegerField', [], {'null': 'True'}) }, u'acl.objectlevel': { 'Meta': {'unique_together': "(('content_type', 'object_id', 'level'),)", 'object_name': 'ObjectLevel'}, 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'level': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['acl.Level']"}), 'object_id': ('django.db.models.fields.IntegerField', [], {}), 'users': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.User']", 'symmetrical': 'False'}) }, 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', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), 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', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) }, 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'dashboard.favourite': { 'Meta': {'object_name': 'Favourite'}, u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'instance': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['vm.Instance']"}), 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) }, u'dashboard.groupprofile': { 'Meta': {'object_name': 'GroupProfile'}, 'description': ('django.db.models.fields.TextField', [], {}), 'group': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['auth.Group']", 'unique': 'True'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'org_id': ('django.db.models.fields.CharField', [], {'max_length': '64', 'unique': 'True', 'null': 'True', 'blank': 'True'}) }, u'dashboard.notification': { 'Meta': {'ordering': "['-created']", 'object_name': 'Notification'}, 'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'message': ('django.db.models.fields.TextField', [], {}), 'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}), 'status': ('model_utils.fields.StatusField', [], {'default': "'new'", 'max_length': '100', u'no_check_for_status': 'True'}), 'subject': ('django.db.models.fields.CharField', [], {'max_length': '128'}), 'to': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) }, u'dashboard.profile': { 'Meta': {'object_name': 'Profile'}, u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'instance_limit': ('django.db.models.fields.IntegerField', [], {'default': '5'}), 'org_id': ('django.db.models.fields.CharField', [], {'max_length': '64', 'unique': 'True', 'null': 'True', 'blank': 'True'}), 'preferred_language': ('django.db.models.fields.CharField', [], {'default': "'en-us'", 'max_length': '32'}), 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['auth.User']", 'unique': 'True'}) }, u'firewall.domain': { 'Meta': {'object_name': 'Domain'}, 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'max_length': '40'}), 'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}), 'ttl': ('django.db.models.fields.IntegerField', [], {'default': '600'}) }, u'firewall.group': { 'Meta': {'object_name': 'Group'}, 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20'}), 'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'}) }, u'firewall.host': { 'Meta': {'unique_together': "(('hostname', 'vlan'),)", 'object_name': 'Host'}, 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['firewall.Group']", 'null': 'True', 'blank': 'True'}), 'hostname': ('django.db.models.fields.CharField', [], {'max_length': '40'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'ipv4': ('firewall.fields.IPAddressField', [], {'unique': 'True', 'max_length': '100'}), 'ipv6': ('firewall.fields.IPAddressField', [], {'max_length': '100', 'unique': 'True', 'null': 'True', 'blank': 'True'}), 'location': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'mac': ('firewall.fields.MACAddressField', [], {'unique': 'True', 'max_length': '17'}), 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), 'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}), 'pub_ipv4': ('firewall.fields.IPAddressField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), 'reverse': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}), 'shared_ip': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'vlan': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['firewall.Vlan']"}) }, u'firewall.vlan': { 'Meta': {'object_name': 'Vlan'}, 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'dhcp_pool': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['firewall.Domain']"}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'ipv6_template': ('django.db.models.fields.TextField', [], {'default': "'2001:738:2001:4031:%(b)d:%(c)d:%(d)d:0'"}), 'managed': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20'}), 'network4': ('firewall.fields.IPNetworkField', [], {'max_length': '100'}), 'network6': ('firewall.fields.IPNetworkField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), 'network_type': ('django.db.models.fields.CharField', [], {'max_length': '20'}), 'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'}), 'reverse_domain': ('django.db.models.fields.TextField', [], {'default': "'%(d)d.%(c)d.%(b)d.%(a)d.in-addr.arpa'"}), 'snat_ip': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39', 'null': 'True', 'blank': 'True'}), 'snat_to': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['firewall.Vlan']", 'null': 'True', 'blank': 'True'}), 'vid': ('django.db.models.fields.IntegerField', [], {'unique': 'True'}) }, u'storage.datastore': { 'Meta': {'ordering': "['name']", 'object_name': 'DataStore'}, 'hostname': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), 'path': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '200'}) }, u'storage.disk': { 'Meta': {'ordering': "['name']", 'object_name': 'Disk'}, 'base': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'derivatives'", 'null': 'True', 'to': u"orm['storage.Disk']"}), 'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}), 'datastore': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['storage.DataStore']"}), 'destroyed': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), 'dev_num': ('django.db.models.fields.CharField', [], {'default': "'a'", 'max_length': '1'}), 'filename': ('django.db.models.fields.CharField', [], {'max_length': '256'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}), 'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), 'ready': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'size': ('sizefield.models.FileSizeField', [], {}), 'type': ('django.db.models.fields.CharField', [], {'max_length': '10'}) }, u'taggit.tag': { 'Meta': {'object_name': 'Tag'}, u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '100'}) }, u'taggit.taggeditem': { 'Meta': {'object_name': 'TaggedItem'}, 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'taggit_taggeditem_tagged_items'", 'to': u"orm['contenttypes.ContentType']"}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'object_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}), 'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'taggit_taggeditem_items'", 'to': u"orm['taggit.Tag']"}) }, u'vm.instance': { 'Meta': {'ordering': "[u'pk']", 'object_name': 'Instance'}, 'access_method': ('django.db.models.fields.CharField', [], {'max_length': '10'}), 'active_since': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), 'arch': ('django.db.models.fields.CharField', [], {'max_length': '10'}), 'boot_menu': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}), 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'destroyed': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), 'disks': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "u'instance_set'", 'symmetrical': 'False', 'to': u"orm['storage.Disk']"}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'lease': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['vm.Lease']"}), 'max_ram_size': ('django.db.models.fields.IntegerField', [], {}), 'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}), 'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), 'node': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'instance_set'", 'null': 'True', 'to': u"orm['vm.Node']"}), 'num_cores': ('django.db.models.fields.IntegerField', [], {}), 'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}), 'priority': ('django.db.models.fields.IntegerField', [], {}), 'pw': ('django.db.models.fields.CharField', [], {'max_length': '20'}), 'ram_size': ('django.db.models.fields.IntegerField', [], {}), 'raw_data': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'req_traits': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['vm.Trait']", 'symmetrical': 'False', 'blank': 'True'}), 'template': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'instance_set'", 'null': 'True', 'to': u"orm['vm.InstanceTemplate']"}), 'time_of_delete': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), 'time_of_suspend': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), 'vnc_port': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'unique': 'True', 'null': 'True', 'blank': 'True'}) }, u'vm.instancetemplate': { 'Meta': {'ordering': "[u'name']", 'object_name': 'InstanceTemplate'}, 'access_method': ('django.db.models.fields.CharField', [], {'max_length': '10'}), 'arch': ('django.db.models.fields.CharField', [], {'max_length': '10'}), 'boot_menu': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}), 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'disks': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "u'template_set'", 'symmetrical': 'False', 'to': u"orm['storage.Disk']"}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'lease': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['vm.Lease']"}), 'max_ram_size': ('django.db.models.fields.IntegerField', [], {}), 'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), 'num_cores': ('django.db.models.fields.IntegerField', [], {}), 'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}), 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['vm.InstanceTemplate']", 'null': 'True', 'blank': 'True'}), 'priority': ('django.db.models.fields.IntegerField', [], {}), 'ram_size': ('django.db.models.fields.IntegerField', [], {}), 'raw_data': ('django.db.models.fields.TextField', [], {'blank': 'True'}), 'req_traits': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['vm.Trait']", 'symmetrical': 'False', 'blank': 'True'}), 'state': ('django.db.models.fields.CharField', [], {'default': "u'NEW'", 'max_length': '10'}), 'system': ('django.db.models.fields.TextField', [], {'blank': 'True'}) }, u'vm.lease': { 'Meta': {'ordering': "[u'name']", 'object_name': 'Lease'}, 'delete_interval_seconds': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), 'suspend_interval_seconds': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) }, u'vm.node': { 'Meta': {'object_name': 'Node'}, 'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}), 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'host': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['firewall.Host']"}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '50'}), 'overcommit': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), 'priority': ('django.db.models.fields.IntegerField', [], {}), 'traits': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['vm.Trait']", 'symmetrical': 'False', 'blank': 'True'}) }, u'vm.trait': { 'Meta': {'object_name': 'Trait'}, u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) } } complete_apps = ['dashboard'] __init__.py 0000664 0000000 0000000 00000000000 12304627050 0034101 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/dashboard/migrations models.py 0000664 0000000 0000000 00000012373 12304627050 0031471 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/dashboard from itertools import chain from logging import getLogger from django.conf import settings from django.contrib.auth.models import User, Group from django.contrib.auth.signals import user_logged_in from django.db.models import ( Model, ForeignKey, OneToOneField, CharField, IntegerField, TextField ) from django.template.loader import render_to_string from django.utils.translation import ugettext_lazy as _, override from model_utils.models import TimeStampedModel from model_utils.fields import StatusField from model_utils import Choices from vm.models import Instance from acl.models import AclBase logger = getLogger(__name__) class Favourite(Model): instance = ForeignKey(Instance) user = ForeignKey(User) class Notification(TimeStampedModel): STATUS = Choices(('new', _('new')), ('delivered', _('delivered')), ('read', _('read'))) status = StatusField() to = ForeignKey(User) subject = CharField(max_length=128) message = TextField() class Meta: ordering = ['-created'] @classmethod def send(cls, user, subject, template, context={}): try: language = user.profile.preferred_language except: language = None with override(language): context['user'] = user rendered = render_to_string(template, context) subject = unicode(subject) return cls.objects.create(to=user, subject=subject, message=rendered) class Profile(Model): user = OneToOneField(User) preferred_language = CharField(verbose_name=_('preferred language'), choices=settings.LANGUAGES, max_length=32, default=settings.LANGUAGE_CODE, blank=False) org_id = CharField( # may be populated from eduPersonOrgId field unique=True, blank=True, null=True, max_length=64, help_text=_('Unique identifier of the person, e.g. a student number.')) instance_limit = IntegerField(default=5) def notify(self, subject, template, context={}): return Notification.send(self.user, subject, template, context) class GroupProfile(AclBase): ACL_LEVELS = ( ('operator', _('operator')), ('owner', _('owner')), ) group = OneToOneField(Group) org_id = CharField( unique=True, blank=True, null=True, max_length=64, help_text=_('Unique identifier of the group at the organization.')) description = TextField() @classmethod def search(cls, name): try: return cls.objects.get(org_id=name).group except cls.DoesNotExist: return Group.objects.get(name=name) def get_or_create_profile(self): obj, created = GroupProfile.objects.get_or_create(group_id=self.pk) return obj Group.profile = property(get_or_create_profile) def create_profile(sender, user, request, **kwargs): if not user.pk: return False profile, created = Profile.objects.get_or_create(user=user) return created user_logged_in.connect(create_profile) if hasattr(settings, 'SAML_ORG_ID_ATTRIBUTE'): logger.debug("Register save_org_id to djangosaml2 pre_user_save") from djangosaml2.signals import pre_user_save def save_org_id(sender, **kwargs): logger.debug("save_org_id called by %s", sender.username) attributes = kwargs.pop('attributes') atr = settings.SAML_ORG_ID_ATTRIBUTE try: value = attributes[atr][0] except Exception as e: value = None logger.info("save_org_id couldn't find attribute. %s", unicode(e)) if sender.pk is None: sender.save() logger.debug("save_org_id saved user %s", unicode(sender)) profile, created = Profile.objects.get_or_create(user=sender) if created or profile.org_id != value: logger.info("org_id of %s added to user %s's profile", value, sender.username) profile.org_id = value profile.save() else: logger.debug("org_id of %s already added to user %s's profile", value, sender.username) memberatrs = getattr(settings, 'SAML_GROUP_ATTRIBUTES', []) for group in chain(*[attributes[i] for i in memberatrs]): try: g = GroupProfile.search(group) except Group.DoesNotExist: logger.debug('cant find membergroup %s', group) else: logger.debug('could find membergroup %s (%s)', group, unicode(g)) g.user_set.add(sender) owneratrs = getattr(settings, 'SAML_GROUP_OWNER_ATTRIBUTES', []) for group in chain(*[attributes[i] for i in owneratrs]): try: g = GroupProfile.search(group) except Group.DoesNotExist: logger.debug('cant find ownergroup %s', group) else: logger.debug('could find ownergroup %s (%s)', group, unicode(g)) g.profile.set_level(sender, 'owner') return False # User did not change pre_user_save.connect(save_org_id) else: logger.debug("Do not register save_org_id to djangosaml2 pre_user_save") static/ 0000775 0000000 0000000 00000000000 12304627050 0031115 5 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/dashboard dashboard/ 0000775 0000000 0000000 00000000000 12304627050 0033044 5 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/dashboard/static bootstrap-slider/ 0000775 0000000 0000000 00000000000 12304627050 0036341 5 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/dashboard/static/dashboard bootstrap-slider.js 0000664 0000000 0000000 00000025756 12304627050 0042213 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/dashboard/static/dashboard/bootstrap-slider /* ========================================================= * bootstrap-slider.js v2.0.0 * http://www.eyecon.ro/bootstrap-slider * ========================================================= * Copyright 2012 Stefan Petre * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ========================================================= */ !function( $ ) { var Slider = function(element, options) { this.element = $(element); this.picker = $('
') .insertBefore(this.element) .append(this.element); this.id = this.element.data('slider-id')||options.id; if (this.id) { this.picker[0].id = this.id; } if (typeof Modernizr !== 'undefined' && Modernizr.touch) { this.touchCapable = true; } var tooltip = this.element.data('slider-tooltip')||options.tooltip; this.tooltip = this.picker.find('.tooltip'); this.tooltipInner = this.tooltip.find('div.tooltip-inner'); this.orientation = this.element.data('slider-orientation')||options.orientation; switch(this.orientation) { case 'vertical': this.picker.addClass('slider-vertical'); this.stylePos = 'top'; this.mousePos = 'pageY'; this.sizePos = 'offsetHeight'; this.tooltip.addClass('right')[0].style.left = '100%'; break; default: this.picker .addClass('slider-horizontal') .css('width', this.element.outerWidth()); this.orientation = 'horizontal'; this.stylePos = 'left'; this.mousePos = 'pageX'; this.sizePos = 'offsetWidth'; this.tooltip.addClass('top')[0].style.top = -this.tooltip.outerHeight() - 14 + 'px'; break; } this.min = this.element.data('slider-min')||options.min; this.max = this.element.data('slider-max')||options.max; this.step = this.element.data('slider-step')||options.step; this.value = this.element.data('slider-value')||options.value; if (this.value[1]) { this.range = true; } this.selection = this.element.data('slider-selection')||options.selection; this.selectionEl = this.picker.find('.slider-selection'); if (this.selection === 'none') { this.selectionEl.addClass('hide'); } this.selectionElStyle = this.selectionEl[0].style; this.handle1 = this.picker.find('.slider-handle:first'); this.handle1Stype = this.handle1[0].style; this.handle2 = this.picker.find('.slider-handle:last'); this.handle2Stype = this.handle2[0].style; var handle = this.element.data('slider-handle')||options.handle; switch(handle) { case 'round': this.handle1.addClass('round'); this.handle2.addClass('round'); break case 'triangle': this.handle1.addClass('triangle'); this.handle2.addClass('triangle'); break } if (this.range) { this.value[0] = Math.max(this.min, Math.min(this.max, this.value[0])); this.value[1] = Math.max(this.min, Math.min(this.max, this.value[1])); } else { this.value = [ Math.max(this.min, Math.min(this.max, this.value))]; this.handle2.addClass('hide'); if (this.selection == 'after') { this.value[1] = this.max; } else { this.value[1] = this.min; } } this.diff = this.max - this.min; this.percentage = [ (this.value[0]-this.min)*100/this.diff, (this.value[1]-this.min)*100/this.diff, this.step*100/this.diff ]; this.offset = this.picker.offset(); this.size = this.picker[0][this.sizePos]; this.formater = options.formater; this.layout(); if (this.touchCapable) { // Touch: Bind touch events: this.picker.on({ touchstart: $.proxy(this.mousedown, this) }); } else { this.picker.on({ mousedown: $.proxy(this.mousedown, this) }); } if (tooltip === 'show') { this.picker.on({ mouseenter: $.proxy(this.showTooltip, this), mouseleave: $.proxy(this.hideTooltip, this) }); } else { this.tooltip.addClass('hide'); } }; Slider.prototype = { constructor: Slider, over: false, inDrag: false, showTooltip: function(){ this.tooltip.addClass('in'); //var left = Math.round(this.percent*this.width); //this.tooltip.css('left', left - this.tooltip.outerWidth()/2); this.over = true; }, hideTooltip: function(){ if (this.inDrag === false) { this.tooltip.removeClass('in'); } this.over = false; }, layout: function(){ this.handle1Stype[this.stylePos] = this.percentage[0]+'%'; this.handle2Stype[this.stylePos] = this.percentage[1]+'%'; if (this.orientation == 'vertical') { this.selectionElStyle.top = Math.min(this.percentage[0], this.percentage[1]) +'%'; this.selectionElStyle.height = Math.abs(this.percentage[0] - this.percentage[1]) +'%'; } else { this.selectionElStyle.left = Math.min(this.percentage[0], this.percentage[1]) +'%'; this.selectionElStyle.width = Math.abs(this.percentage[0] - this.percentage[1]) +'%'; } if (this.range) { this.tooltipInner.text( this.formater(this.value[0]) + ' : ' + this.formater(this.value[1]) ); this.tooltip[0].style[this.stylePos] = this.size * (this.percentage[0] + (this.percentage[1] - this.percentage[0])/2)/100 - (this.orientation === 'vertical' ? this.tooltip.outerHeight()/2 : this.tooltip.outerWidth()/2) +'px'; } else { this.tooltipInner.text( this.formater(this.value[0]) ); this.tooltip[0].style[this.stylePos] = this.size * this.percentage[0]/100 - (this.orientation === 'vertical' ? this.tooltip.outerHeight()/2 : this.tooltip.outerWidth()/2) +'px'; } }, mousedown: function(ev) { // Touch: Get the original event: if (this.touchCapable && ev.type === 'touchstart') { ev = ev.originalEvent; } this.offset = this.picker.offset(); this.size = this.picker[0][this.sizePos]; var percentage = this.getPercentage(ev); if (this.range) { var diff1 = Math.abs(this.percentage[0] - percentage); var diff2 = Math.abs(this.percentage[1] - percentage); this.dragged = (diff1 < diff2) ? 0 : 1; } else { this.dragged = 0; } this.percentage[this.dragged] = percentage; this.layout(); if (this.touchCapable) { // Touch: Bind touch events: $(document).on({ touchmove: $.proxy(this.mousemove, this), touchend: $.proxy(this.mouseup, this) }); } else { $(document).on({ mousemove: $.proxy(this.mousemove, this), mouseup: $.proxy(this.mouseup, this) }); } this.inDrag = true; var val = this.calculateValue(); this.element.trigger({ type: 'slideStart', value: val }).trigger({ type: 'slide', value: val }); return false; }, mousemove: function(ev) { // Touch: Get the original event: if (this.touchCapable && ev.type === 'touchmove') { ev = ev.originalEvent; } var percentage = this.getPercentage(ev); if (this.range) { if (this.dragged === 0 && this.percentage[1] < percentage) { this.percentage[0] = this.percentage[1]; this.dragged = 1; } else if (this.dragged === 1 && this.percentage[0] > percentage) { this.percentage[1] = this.percentage[0]; this.dragged = 0; } } this.percentage[this.dragged] = percentage; this.layout(); var val = this.calculateValue(); this.element .trigger({ type: 'slide', value: val }) .data('value', val) .prop('value', val); return false; }, mouseup: function(ev) { if (this.touchCapable) { // Touch: Bind touch events: $(document).off({ touchmove: this.mousemove, touchend: this.mouseup }); } else { $(document).off({ mousemove: this.mousemove, mouseup: this.mouseup }); } this.inDrag = false; if (this.over == false) { this.hideTooltip(); } this.element; var val = this.calculateValue(); this.element .trigger({ type: 'slideStop', value: val }) .data('value', val) .prop('value', val); return false; }, calculateValue: function() { var val; if (this.range) { val = [ (this.min + Math.round((this.diff * this.percentage[0]/100)/this.step)*this.step), (this.min + Math.round((this.diff * this.percentage[1]/100)/this.step)*this.step) ]; this.value = val; } else { val = (this.min + Math.round((this.diff * this.percentage[0]/100)/this.step)*this.step); this.value = [val, this.value[1]]; } return val; }, getPercentage: function(ev) { if (this.touchCapable) { ev = ev.touches[0]; } var percentage = (ev[this.mousePos] - this.offset[this.stylePos])*100/this.size; percentage = Math.round(percentage/this.percentage[2])*this.percentage[2]; return Math.max(0, Math.min(100, percentage)); }, getValue: function() { if (this.range) { return this.value; } return this.value[0]; }, setValue: function(val) { this.value = val; if (this.range) { this.value[0] = Math.max(this.min, Math.min(this.max, this.value[0])); this.value[1] = Math.max(this.min, Math.min(this.max, this.value[1])); } else { this.value = [ Math.max(this.min, Math.min(this.max, this.value))]; this.handle2.addClass('hide'); if (this.selection == 'after') { this.value[1] = this.max; } else { this.value[1] = this.min; } } this.diff = this.max - this.min; this.percentage = [ (this.value[0]-this.min)*100/this.diff, (this.value[1]-this.min)*100/this.diff, this.step*100/this.diff ]; this.layout(); } }; $.fn.slider = function ( option, val ) { return this.each(function () { var $this = $(this), data = $this.data('slider'), options = typeof option === 'object' && option; if (!data) { $this.data('slider', (data = new Slider(this, $.extend({}, $.fn.slider.defaults,options)))); } if (typeof option == 'string') { data[option](val); } }) }; $.fn.slider.defaults = { min: 0, max: 10, step: 1, orientation: 'horizontal', value: 5, selection: 'before', tooltip: 'show', handle: 'round', formater: function(value) { return value; } }; $.fn.slider.Constructor = Slider; }( window.jQuery ); less/ 0000775 0000000 0000000 00000000000 12304627050 0037307 5 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/dashboard/static/dashboard/bootstrap-slider slider.less 0000664 0000000 0000000 00000004275 12304627050 0041471 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/dashboard/static/dashboard/bootstrap-slider/less /*! * Slider for Bootstrap * * Copyright 2012 Stefan Petre * Licensed under the Apache License v2.0 * http://www.apache.org/licenses/LICENSE-2.0 * */ .slider { display: inline-block; vertical-align: middle; position: relative; &.slider-horizontal { width: 210px; height: @baseLineHeight; .slider-track { height: @baseLineHeight/2; width: 100%; margin-top: -@baseLineHeight/4; top: 50%; left: 0; } .slider-selection { height: 100%; top: 0; bottom: 0; } .slider-handle { margin-left: -@baseLineHeight/2; margin-top: -@baseLineHeight/4; &.triangle { border-width: 0 @baseLineHeight/2 @baseLineHeight/2 @baseLineHeight/2; width: 0; height: 0; border-bottom-color: #0480be; margin-top: 0; } } } &.slider-vertical { height: 210px; width: @baseLineHeight; .slider-track { width: @baseLineHeight/2; height: 100%; margin-left: -@baseLineHeight/4; left: 50%; top: 0; } .slider-selection { width: 100%; left: 0; top: 0; bottom: 0; } .slider-handle { margin-left: -@baseLineHeight/4; margin-top: -@baseLineHeight/2; &.triangle { border-width: @baseLineHeight/2 0 @baseLineHeight/2 @baseLineHeight/2; width: 1px; height: 1px; border-left-color: #0480be; margin-left: 0; } } } input { display: none; } .tooltip-inner { white-space: nowrap; } } .slider-track { position: absolute; cursor: pointer; #gradient > .vertical(#f5f5f5, #f9f9f9); .box-shadow(inset 0 1px 2px rgba(0,0,0,.1)); .border-radius(@baseBorderRadius); } .slider-selection { position: absolute; #gradient > .vertical(#f9f9f9, #f5f5f5); .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15)); .box-sizing(border-box); .border-radius(@baseBorderRadius); } .slider-handle { position: absolute; width: @baseLineHeight; height: @baseLineHeight; #gradient > .vertical(#149bdf, #0480be); .box-shadow(~"inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05)"); opacity: 0.8; border: 0px solid transparent; &.round { .border-radius(@baseLineHeight); } &.triangle { background: transparent none; } } slider.css 0000664 0000000 0000000 00000013523 12304627050 0040341 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/dashboard/static/dashboard/bootstrap-slider /*! * Slider for Bootstrap * * Copyright 2012 Stefan Petre * Licensed under the Apache License v2.0 * http://www.apache.org/licenses/LICENSE-2.0 * */ .slider { display: inline-block; vertical-align: middle; position: relative; } .slider.slider-horizontal { width: 210px; height: 20px; } .slider.slider-horizontal .slider-track { height: 10px; width: 100%; margin-top: -5px; top: 50%; left: 0; } .slider.slider-horizontal .slider-selection { height: 100%; top: 0; bottom: 0; } .slider.slider-horizontal .slider-handle { margin-left: -10px; margin-top: -5px; } .slider.slider-horizontal .slider-handle.triangle { border-width: 0 10px 10px 10px; width: 0; height: 0; border-bottom-color: #0480be; margin-top: 0; } .slider.slider-vertical { height: 210px; width: 20px; } .slider.slider-vertical .slider-track { width: 10px; height: 100%; margin-left: -5px; left: 50%; top: 0; } .slider.slider-vertical .slider-selection { width: 100%; left: 0; top: 0; bottom: 0; } .slider.slider-vertical .slider-handle { margin-left: -5px; margin-top: -10px; } .slider.slider-vertical .slider-handle.triangle { border-width: 10px 0 10px 10px; width: 1px; height: 1px; border-left-color: #0480be; margin-left: 0; } .slider input { display: none; } .slider .tooltip-inner { white-space: nowrap; } .slider-track { position: absolute; cursor: pointer; background-color: #f7f7f7; background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } .slider-selection { position: absolute; background-color: #f7f7f7; background-image: -moz-linear-gradient(top, #f9f9f9, #f5f5f5); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f9f9f9), to(#f5f5f5)); background-image: -webkit-linear-gradient(top, #f9f9f9, #f5f5f5); background-image: -o-linear-gradient(top, #f9f9f9, #f5f5f5); background-image: linear-gradient(to bottom, #f9f9f9, #f5f5f5); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9f9f9', endColorstr='#fff5f5f5', GradientType=0); -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } .slider-handle { position: absolute; width: 20px; height: 20px; background-color: #0e90d2; background-image: -moz-linear-gradient(top, #149bdf, #0480be); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); background-image: -webkit-linear-gradient(top, #149bdf, #0480be); background-image: -o-linear-gradient(top, #149bdf, #0480be); background-image: linear-gradient(to bottom, #149bdf, #0480be); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); opacity: 0.8; border: 0px solid transparent; } .slider-handle.round { -webkit-border-radius: 20px; -moz-border-radius: 20px; border-radius: 20px; } .slider-handle.triangle { background: transparent none; } /* custom */ .slider-handle, .slider-handle:hover { background-color: #3071a9; opacity: 1; width: 8px; height: 26px; margin-top: -4px!important; margin-left: -6px !important; border-radius: 0px; -moz-border-radius: 0px; -webkit-border-radius: 0px; text-shadow: 0 1px 0 #fff; background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#3071a9)); background-image: -webkit-linear-gradient(top, #428bca, 0%, #3071a9, 100%); background-image: -moz-linear-gradient(top, #428bca 0%, #3071a9 100%); background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%); background-repeat: repeat-x; border-color: #2d6ca2; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0); } .slider-handle:hover { background: #428bca; background-image: none; border-color: #2d6ca2; } .slider-track, .slider-selection { height: 20px !important; background: #ccc; background: -webkit-linear-gradient(top, #bbb, #ddd); background: -moz-linear-gradient(top, #bbb, #ddd); background: linear-gradient(top, #bbb, #ddd); -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,0.1); -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,0.1); box-shadow: inset 0 2px 4px rgba(0,0,0,0.1); -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; border: 1px solid #aaa; } .slider-selection { background-color: #8DCA09; background: -webkit-linear-gradient(top, #8DCA09, #72A307); background: -moz-linear-gradient(top, #8DCA09, #72A307); background: linear-gradient(top, #8DCA09, #72A307); border-color: #496805; } .vm-slider { width: 300px; } .output { padding-left: 10px; font-weight: bold; } dashboard.css 0000664 0000000 0000000 00000016124 12304627050 0035511 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/dashboard/static/dashboard /* Move down content because we have a fixed navbar that is 50px tall */ body { padding-top: 50px; padding-bottom: 20px; } /* Set widths on the navbar form inputs since otherwise they're 100% wide */ .navbar-form input[type="text"], .navbar-form input[type="password"] { width: 180px; } /* Wrapping element */ /* Set some basic padding to keep content from hitting the edges */ .body-content { padding-left: 15px; padding-right: 15px; } /* Responsive: Portrait tablets and up */ @media screen and (min-width: 768px) { /* Let the jumbotron breathe */ .container > :first-child { margin-top: 20px; } /* Remove padding from wrapping element since we kick in the grid classes here */ .body-content { padding: 0; } } .no-margin { margin: 0!important; } .list-group .list-group-footer { padding-top: 5px; padding-bottom: 5px; } .big { font-size: 2em; } .bigbig { font-size: 3em; } .timeline { border-left: 4px #428bca solid; margin-left: 20px; padding-left: 20px; } .timeline > div { margin: 0; padding: 0; margin-left: -34px; margin-bottom: .5em; line-height: 24px; } .timeline > div:last-child { margin-bottom: 0; } .timeline .timeline-icon { margin: 0; padding: 0; width: 24px; height: 24px; text-align: center; display: inline-block; border-radius: 50%; background-color: #428bca; color: #fff; } .timeline-icon.timeline-warning { border-color: #c09853; border-style: solid; border-width: 2px; background-color: white; color: #c09853; line-height: 20px; } .timeline .timeline-icon.timeline-nobg { background-color: transparent; } .sub-timeline { } .sub-activity { margin-left: 30px; padding-left: 10px; border-left: 3px solid green; } .sub-activity-failed { border-left: 3px solid #d9534f; } .timeline-icon-failed { background-color: #d9534f !important; } .table-with-form-fields tbody tr td { line-height: 34px; } #vm-detail-panel .panel-body { min-height: 20em; } #node-detail-panel .panel-body { min-height: 20em; } #group-detail-panel .panel-body { min-height: 20em; } :link i:before:hover { text-decoration: none !important; } .slider { display: inline-block; } .slider .track { height: 20px; top: 50%; } .slider > .dragger, .slider > .dragger:hover { border-radius: 0px; -moz-border-radius: 0px; -webkit-border-radius: 0px; width: 8px; height: 24px; margin-top: -12px!important; text-shadow: 0 1px 0 #fff; background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#3071a9)); background-image: -webkit-linear-gradient(top, #428bca, 0%, #3071a9, 100%); background-image: -moz-linear-gradient(top, #428bca 0%, #3071a9 100%); background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%); background-repeat: repeat-x; border-color: #2d6ca2; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0); } .slider > .dragger:hover { background-color: #3071a9; background-image: none; border-color: #2d6ca2; } .slider > .highlight-track { height: 20px; top: 50%; } .slider + .output { } .rule-table tr >:nth-child(1) { text-align: right; } .rule-table tr >:nth-child(2) { text-align: center; } .dashboard-index .panel { height: 300px; } #vm-details-rename, #vm-details-rename *, #vm-details-h1-name, #vm-list-rename, #vm-list-rename *, #node-details-rename, #node-details-rename *, #node-details-h1-name, #node-list-rename, #node-list-rename *#group-details-rename, #group-details-rename *, #group-details-h1-name, #group-list-rename, #group-list-rename * { display: inline; } #vm-details-rename, #vm-list-rename, #node-details-rename, #node-list-rename, #group-details-rename, #group-list-rename { display: none; } #vm-details-rename-name, #node-details-rename-name, #group-details-rename-name { max-width: 160px; } #vm-list-rename-name, #node-list-rename-name, #group-list-rename-name { max-width: 100px; } .label-tag { /* pass */ } #vm-details-tags-form { margin-top: 15px; max-width: 250px; } .vm-details-remove-tag { color: white; padding-left: 5px; } .vm-details-remove-tag:hover { cursor: pointer; color: black; text-decoration: none; } /* small buttons for tags, copied from Bootstraps input-sm, bnt-sm */ .btn-tags { padding: 3px 6px; font-size: 11px; line-height: 1.5; border-radius: 3px; } .input-tags { height: 22px; padding: 2px 8px; font-size: 11px; line-height: 1.5; border-radius: 3px; } /* --- */ .vm-details-remove-port:hover { text-decoration: none; } /* arrow in port add table */ #ipv4 tbody td:nth-child(2), #ipv6 tbody td:nth-child(2) { width: 60px; } /* port add buttons */ .vm-details-network-port-add .input-group-addon, .vm-details-network-port-add .input-group-btn { width: inherit ; } /* vm-create */ a.hover-black { color:white; } .hover-black:hover { color: black /*#d9534f*/; text-decoration: none; } .no-js-hidden { display: none; } #vm-create-network-addcheckbox-managed { -webkit-transform: scale(1.3, 1.3); margin-top: 4px; } /* --- */ .interval-input { margin-bottom: 20px; max-width: 600px; } .interval-input input { text-align: right; } /* vm details connection */ .vm-details-pw dd { margin-left: 155px; } .vm-details-pw dt { width: 140px; } #vm-details-pw-confirm { margin-top: 10px; display: none; } .dashboard-vm-details-network-h3 { margin-top: 20px; } /* font awesome font */ .font-awesome-font { font-family: "FontAwesome"; } .template-list-table tbody>tr>td, .template-list-table thead>tr>th, .lease-list-table tbody>tr>td, .lease-list-table thead>tr>th { vertical-align: middle; text-align: center; } .template-list-table td:nth-child(1), .lease-list-table td:nth-child(1) { text-align: left; } .template-list-table-thin { width: 95px; } .dropdown-menu { position:absolute; display:none; z-index: 1; } .dropdown-toggle:focus + .dropdown-menu { display: block; } .dropdown-toggle:focus { outline:none; } .dropdown-menu:hover{ display: block; } <<<<<<< HEAD .notification-messages { padding: 10px 8px; width: 350px; } .notification-message { margin-bottom: 10px; padding: 0 0 4px 0; border-bottom: 1px dotted #D3D3D3; } .notification-messages .notification-message:last-child { margin-bottom: 0px; padding: 0px; border-bottom: none; } .notification-message-text { padding: 8px 15px; display: none; } .notification-message .notification-message-subject { cursor: pointer; } #vm-migrate-node-list { list-style: none; } #vm-migrate-node-list li { padding-bottom: 10px; } .vm-migrate-node-property { display: block; padding-left: 15px; } dashboard.js 0000664 0000000 0000000 00000030311 12304627050 0035327 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/dashboard/static/dashboard $(function () { $('.vm-create').click(function(e) { var template = $(this).data("template"); $.ajax({ type: 'GET', url: '/dashboard/vm/create/', success: function(data) { $('body').append(data); vmCreateLoaded(); addSliderMiscs(); $('#create-modal').modal('show'); $('#create-modal').on('hidden.bs.modal', function() { $('#create-modal').remove(); }); if(template) { $('#vm-create-template-select option[value="' + template + '"]').prop("selected", true).trigger("change"); } } }); return false; }); $('.node-create').click(function(e) { $.ajax({ type: 'GET', url: '/dashboard/node/create/', success: function(data) { $('body').append(data); nodeCreateLoaded(); addSliderMiscs(); $('#create-modal').modal('show'); $('#create-modal').on('hidden.bs.modal', function() { $('#create-modal').remove(); }); } }); return false; }); $('[href=#index-graph-view]').click(function (e) { var box = $(this).data('index-box'); $("#" + box + "-list-view").hide(); $("#" + box + "-graph-view").show(); $(this).next('a').removeClass('disabled'); $(this).addClass('disabled'); e.stopImmediatePropagation(); return false; }); $('[href=#index-list-view]').click(function (e) { var box = $(this).data('index-box'); $('#' + box + '-graph-view').hide(); $('#' + box + '-list-view').show(); $(this).addClass('disabled'); $(this).prev("a").removeClass('disabled'); e.stopImmediatePropagation(); return false; }); $('[title]:not(.title-favourite)').tooltip(); $('.title-favourite').tooltip({'placement': 'right'}); $(':input[title]').tooltip({trigger: 'focus', placement: 'auto right'}); $(".knob").knob(); $('[data-toggle="pill"]').click(function() { window.location.hash = $(this).attr('href'); }); if (window.location.hash) { if(window.location.hash.substring(1,4) == "ipv") $("a[href=#network]").tab('show'); $("a[href=" + window.location.hash +"]").tab('show'); } /* no js compatibility */ $('.no-js-hidden').show(); $('.js-hidden').hide(); /* favourite star */ $("#dashboard-vm-list").on('click', '.dashboard-vm-favourite', function(e) { var star = $(this).children("i"); var pk = $(this).data("vm"); if(star.hasClass("icon-star-empty")) { star.removeClass("icon-star-empty").addClass("icon-star"); star.prop("title", "Unfavourite"); } else { star.removeClass("icon-star").addClass("icon-star-empty"); star.prop("title", "Mark as favourite"); } $.ajax({ url: "/dashboard/favourite/", type: "POST", data: {'vm': pk}, headers: {"X-CSRFToken": getCookie('csrftoken')}, success: function(data, textStatus, xhr) { // success }, error: function(xhr, textStatus, error) { console.log("oh babám"); } }); $(star).tooltip('destroy').tooltip({'placement': 'right'}); my_vms = []; return false; }); /* scroll to top if there is a message */ if($(".messagelist").children(".alert").length > 0) $('body').animate({scrollTop: 0}); addSliderMiscs(); /* for VM removes buttons */ $('.vm-delete').click(function() { var vm_pk = $(this).data('vm-pk'); var dir = window.location.pathname.indexOf('list') == -1; addModalConfirmation(deleteObject, { 'url': '/dashboard/vm/delete/' + vm_pk + '/', 'data': [], 'pk': vm_pk, 'type': "vm", 'redirect': dir}); return false; }); /* for Node removes buttons */ $('.node-delete').click(function() { var node_pk = $(this).data('node-pk'); var dir = window.location.pathname.indexOf('list') == -1; addModalConfirmation(deleteObject, { 'url': '/dashboard/node/delete/' + node_pk + '/', 'data': [], 'pk': node_pk, 'type': "node", 'redirect': dir}); return false; }); /* for Node removes buttons */ $('.group-delete').click(function() { var group_pk = $(this).data('group-pk'); var dir = window.location.pathname.indexOf('list') == -1; addModalConfirmation(deleteObject, { 'url': '/dashboard/group/delete/' + group_pk + '/', 'data': [], 'type': "group", 'pk': group_pk, 'redirect': dir}); return false; }); /* for Group removes buttons */ $('.group-delete').click(function() { var group_pk = $(this).data('group-pk'); var dir = window.location.pathname.indexOf('list') == -1; addModalConfirmation(deleteGroup, { 'url': '/dashboard/group/delete/' + group_pk + '/', 'data': [], 'group_pk': group_pk, 'redirect': dir}); return false; }); /* search for vms */ var my_vms = [] $("#dashboard-vm-search-input").keyup(function(e) { // if my_vms is empty get a list of our vms if(my_vms.length < 1) { $.ajaxSetup( { "async": false } ); $.get("/dashboard/vm/list/", function(result) { for(var i in result) { my_vms.push({ 'pk': result[i].pk, 'name': result[i].name.toLowerCase(), 'state': result[i].state, 'fav': result[i].fav, }); } }); $.ajaxSetup( { "async": true } ); } input = $("#dashboard-vm-search-input").val().toLowerCase(); var search_result = [] var html = ''; for(var i in my_vms) { if(my_vms[i].name.indexOf(input) != -1) { search_result.push(my_vms[i]); } } search_result.sort(compareVmByFav); for(var i=0; i<5 && i
* k.o.call(this);
*
*/
k.o = function () {
var s = this;
this.o = null; // array of options
this.$ = null; // jQuery wrapped element
this.i = null; // mixed HTMLInputElement or array of HTMLInputElement
this.g = null; // 2D graphics context for 'pre-rendering'
this.v = null; // value ; mixed array or integer
this.cv = null; // change value ; not commited value
this.x = 0; // canvas x position
this.y = 0; // canvas y position
this.$c = null; // jQuery canvas element
this.c = null; // rendered canvas context
this.t = 0; // touches index
this.isInit = false;
this.fgColor = null; // main color
this.pColor = null; // previous color
this.dH = null; // draw hook
this.cH = null; // change hook
this.eH = null; // cancel hook
this.rH = null; // release hook
this.scale = 1; // scale factor
this.run = function () {
var cf = function (e, conf) {
var k;
for (k in conf) {
s.o[k] = conf[k];
}
s.init();
s._configure()
._draw();
};
if(this.$.data('kontroled')) return;
this.$.data('kontroled', true);
this.extend();
this.o = $.extend(
{
// Config
min : this.$.data('min') || 0,
max : this.$.data('max') || 100,
stopper : true,
readOnly : this.$.data('readonly'),
// UI
cursor : (this.$.data('cursor') === true && 30)
|| this.$.data('cursor')
|| 0,
thickness : this.$.data('thickness') || 0.35,
lineCap : this.$.data('linecap') || 'butt',
width : this.$.data('width') || 200,
height : this.$.data('height') || 200,
displayInput : this.$.data('displayinput') == null || this.$.data('displayinput'),
displayPrevious : this.$.data('displayprevious'),
fgColor : this.$.data('fgcolor') || '#87CEEB',
inputColor: this.$.data('inputcolor') || this.$.data('fgcolor') || '#87CEEB',
inline : false,
step : this.$.data('step') || 1,
// Hooks
draw : null, // function () {}
change : null, // function (value) {}
cancel : null, // function () {}
release : null, // function (value) {}
error : null // function () {}
}, this.o
);
// routing value
if(this.$.is('fieldset')) {
// fieldset = array of integer
this.v = {};
this.i = this.$.find('input')
this.i.each(function(k) {
var $this = $(this);
s.i[k] = $this;
s.v[k] = $this.val();
$this.bind(
'change'
, function () {
var val = {};
val[k] = $this.val();
s.val(val);
}
);
});
this.$.find('legend').remove();
} else {
// input = integer
this.i = this.$;
this.v = this.$.val();
(this.v == '') && (this.v = this.o.min);
this.$.bind(
'change'
, function () {
s.val(s._validate(s.$.val()));
}
);
}
(!this.o.displayInput) && this.$.hide();
this.$c = $('');
this.c = this.$c[0].getContext? this.$c[0].getContext('2d') : null;
if (!this.c) {
this.o.error && this.o.error();
return;
}
this.$
.wrap($(''))
.before(this.$c);
this.scale = (window.devicePixelRatio || 1) /
(
this.c.webkitBackingStorePixelRatio ||
this.c.mozBackingStorePixelRatio ||
this.c.msBackingStorePixelRatio ||
this.c.oBackingStorePixelRatio ||
this.c.backingStorePixelRatio || 1
);
if (this.scale !== 1) {
this.$c[0].width = this.$c[0].width * this.scale;
this.$c[0].height = this.$c[0].height * this.scale;
this.$c.width(this.o.width);
this.$c.height(this.o.height);
}
if (this.v instanceof Object) {
this.cv = {};
this.copy(this.v, this.cv);
} else {
this.cv = this.v;
}
this.$
.bind("configure", cf)
.parent()
.bind("configure", cf);
this._listen()
._configure()
._xy()
.init();
this.isInit = true;
this._draw();
return this;
};
this._draw = function () {
// canvas pre-rendering
var d = true,
c = document.createElement('canvas');
c.width = s.o.width * s.scale;
c.height = s.o.height * s.scale;
s.g = c.getContext('2d');
s.clear();
s.dH
&& (d = s.dH());
(d !== false) && s.draw();
s.c.drawImage(c, 0, 0);
c = null;
};
this._touch = function (e) {
var touchMove = function (e) {
var v = s.xy2val(
e.originalEvent.touches[s.t].pageX,
e.originalEvent.touches[s.t].pageY
);
if (v == s.cv) return;
if (
s.cH
&& (s.cH(v) === false)
) return;
s.change(s._validate(v));
s._draw();
};
// get touches index
this.t = k.c.t(e);
// First touch
touchMove(e);
// Touch events listeners
k.c.d
.bind("touchmove.k", touchMove)
.bind(
"touchend.k"
, function () {
k.c.d.unbind('touchmove.k touchend.k');
if (
s.rH
&& (s.rH(s.cv) === false)
) return;
s.val(s.cv);
}
);
return this;
};
this._mouse = function (e) {
var mouseMove = function (e) {
var v = s.xy2val(e.pageX, e.pageY);
if (v == s.cv) return;
if (
s.cH
&& (s.cH(v) === false)
) return;
s.change(s._validate(v));
s._draw();
};
// First click
mouseMove(e);
// Mouse events listeners
k.c.d
.bind("mousemove.k", mouseMove)
.bind(
// Escape key cancel current change
"keyup.k"
, function (e) {
if (e.keyCode === 27) {
k.c.d.unbind("mouseup.k mousemove.k keyup.k");
if (
s.eH
&& (s.eH() === false)
) return;
s.cancel();
}
}
)
.bind(
"mouseup.k"
, function (e) {
k.c.d.unbind('mousemove.k mouseup.k keyup.k');
if (
s.rH
&& (s.rH(s.cv) === false)
) return;
s.val(s.cv);
}
);
return this;
};
this._xy = function () {
var o = this.$c.offset();
this.x = o.left;
this.y = o.top;
return this;
};
this._listen = function () {
if (!this.o.readOnly) {
this.$c
.bind(
"mousedown"
, function (e) {
e.preventDefault();
s._xy()._mouse(e);
}
)
.bind(
"touchstart"
, function (e) {
e.preventDefault();
s._xy()._touch(e);
}
);
this.listen();
} else {
this.$.attr('readonly', 'readonly');
}
return this;
};
this._configure = function () {
// Hooks
if (this.o.draw) this.dH = this.o.draw;
if (this.o.change) this.cH = this.o.change;
if (this.o.cancel) this.eH = this.o.cancel;
if (this.o.release) this.rH = this.o.release;
if (this.o.displayPrevious) {
this.pColor = this.h2rgba(this.o.fgColor, "0.4");
this.fgColor = this.h2rgba(this.o.fgColor, "0.6");
} else {
this.fgColor = this.o.fgColor;
}
return this;
};
this._clear = function () {
this.$c[0].width = this.$c[0].width;
};
this._validate = function(v) {
return (~~ (((v < 0) ? -0.5 : 0.5) + (v/this.o.step))) * this.o.step;
};
// Abstract methods
this.listen = function () {}; // on start, one time
this.extend = function () {}; // each time configure triggered
this.init = function () {}; // each time configure triggered
this.change = function (v) {}; // on change
this.val = function (v) {}; // on release
this.xy2val = function (x, y) {}; //
this.draw = function () {}; // on change / on release
this.clear = function () { this._clear(); };
// Utils
this.h2rgba = function (h, a) {
var rgb;
h = h.substring(1,7)
rgb = [parseInt(h.substring(0,2),16)
,parseInt(h.substring(2,4),16)
,parseInt(h.substring(4,6),16)];
return "rgba(" + rgb[0] + "," + rgb[1] + "," + rgb[2] + "," + a + ")";
};
this.copy = function (f, t) {
for (var i in f) { t[i] = f[i]; }
};
};
/**
* k.Dial
*/
k.Dial = function () {
k.o.call(this);
this.startAngle = null;
this.xy = null;
this.radius = null;
this.lineWidth = null;
this.cursorExt = null;
this.w2 = null;
this.PI2 = 2*Math.PI;
this.extend = function () {
this.o = $.extend(
{
bgColor : this.$.data('bgcolor') || '#EEEEEE',
angleOffset : this.$.data('angleoffset') || 0,
angleArc : this.$.data('anglearc') || 360,
inline : true
}, this.o
);
};
this.val = function (v) {
if (null != v) {
this.cv = this.o.stopper ? max(min(v, this.o.max), this.o.min) : v;
this.v = this.cv;
this.$.val(this.v);
this._draw();
} else {
return this.v;
}
};
this.xy2val = function (x, y) {
var a, ret;
a = Math.atan2(
x - (this.x + this.w2)
, - (y - this.y - this.w2)
) - this.angleOffset;
if(this.angleArc != this.PI2 && (a < 0) && (a > -0.5)) {
// if isset angleArc option, set to min if .5 under min
a = 0;
} else if (a < 0) {
a += this.PI2;
}
ret = ~~ (0.5 + (a * (this.o.max - this.o.min) / this.angleArc))
+ this.o.min;
this.o.stopper
&& (ret = max(min(ret, this.o.max), this.o.min));
return ret;
};
this.listen = function () {
// bind MouseWheel
var s = this,
mw = function (e) {
e.preventDefault();
var ori = e.originalEvent
,deltaX = ori.detail || ori.wheelDeltaX
,deltaY = ori.detail || ori.wheelDeltaY
,v = parseInt(s.$.val()) + (deltaX>0 || deltaY>0 ? s.o.step : deltaX<0 || deltaY<0 ? -s.o.step : 0);
if (
s.cH
&& (s.cH(v) === false)
) return;
s.val(v);
}
, kval, to, m = 1, kv = {37:-s.o.step, 38:s.o.step, 39:s.o.step, 40:-s.o.step};
this.$
.bind(
"keydown"
,function (e) {
var kc = e.keyCode;
// numpad support
if(kc >= 96 && kc <= 105) {
kc = e.keyCode = kc - 48;
}
kval = parseInt(String.fromCharCode(kc));
if (isNaN(kval)) {
(kc !== 13) // enter
&& (kc !== 8) // bs
&& (kc !== 9) // tab
&& (kc !== 189) // -
&& e.preventDefault();
// arrows
if ($.inArray(kc,[37,38,39,40]) > -1) {
e.preventDefault();
var v = parseInt(s.$.val()) + kv[kc] * m;
s.o.stopper
&& (v = max(min(v, s.o.max), s.o.min));
s.change(v);
s._draw();
// long time keydown speed-up
to = window.setTimeout(
function () { m*=2; }
,30
);
}
}
}
)
.bind(
"keyup"
,function (e) {
if (isNaN(kval)) {
if (to) {
window.clearTimeout(to);
to = null;
m = 1;
s.val(s.$.val());
}
} else {
// kval postcond
(s.$.val() > s.o.max && s.$.val(s.o.max))
|| (s.$.val() < s.o.min && s.$.val(s.o.min));
}
}
);
this.$c.bind("mousewheel DOMMouseScroll", mw);
this.$.bind("mousewheel DOMMouseScroll", mw)
};
this.init = function () {
if (
this.v < this.o.min
|| this.v > this.o.max
) this.v = this.o.min;
this.$.val(this.v);
this.w2 = this.o.width / 2;
this.cursorExt = this.o.cursor / 100;
this.xy = this.w2 * this.scale;
this.lineWidth = this.xy * this.o.thickness;
this.lineCap = this.o.lineCap;
this.radius = this.xy - this.lineWidth / 2;
this.o.angleOffset
&& (this.o.angleOffset = isNaN(this.o.angleOffset) ? 0 : this.o.angleOffset);
this.o.angleArc
&& (this.o.angleArc = isNaN(this.o.angleArc) ? this.PI2 : this.o.angleArc);
// deg to rad
this.angleOffset = this.o.angleOffset * Math.PI / 180;
this.angleArc = this.o.angleArc * Math.PI / 180;
// compute start and end angles
this.startAngle = 1.5 * Math.PI + this.angleOffset;
this.endAngle = 1.5 * Math.PI + this.angleOffset + this.angleArc;
var s = max(
String(Math.abs(this.o.max)).length
, String(Math.abs(this.o.min)).length
, 2
) + 2;
this.o.displayInput
&& this.i.css({
'width' : ((this.o.width / 2 + 4) >> 0) + 'px'
,'height' : ((this.o.width / 3) >> 0) + 'px'
,'position' : 'absolute'
,'vertical-align' : 'middle'
,'margin-top' : ((this.o.width / 3) >> 0) + 'px'
,'margin-left' : '-' + ((this.o.width * 3 / 4 + 2) >> 0) + 'px'
,'border' : 0
,'background' : 'none'
,'font' : 'bold ' + ((this.o.width / s) >> 0) + 'px Arial'
,'text-align' : 'center'
,'color' : this.o.inputColor || this.o.fgColor
,'padding' : '0px'
,'-webkit-appearance': 'none'
})
|| this.i.css({
'width' : '0px'
,'visibility' : 'hidden'
});
};
this.change = function (v) {
this.cv = v;
this.$.val(v);
};
this.angle = function (v) {
return (v - this.o.min) * this.angleArc / (this.o.max - this.o.min);
};
this.draw = function () {
var c = this.g, // context
a = this.angle(this.cv) // Angle
, sat = this.startAngle // Start angle
, eat = sat + a // End angle
, sa, ea // Previous angles
, r = 1;
c.lineWidth = this.lineWidth;
c.lineCap = this.lineCap;
this.o.cursor
&& (sat = eat - this.cursorExt)
&& (eat = eat + this.cursorExt);
c.beginPath();
c.strokeStyle = this.o.bgColor;
c.arc(this.xy, this.xy, this.radius, this.endAngle, this.startAngle, true);
c.stroke();
if (this.o.displayPrevious) {
ea = this.startAngle + this.angle(this.v);
sa = this.startAngle;
this.o.cursor
&& (sa = ea - this.cursorExt)
&& (ea = ea + this.cursorExt);
c.beginPath();
c.strokeStyle = this.pColor;
c.arc(this.xy, this.xy, this.radius, sa, ea, false);
c.stroke();
r = (this.cv == this.v);
}
c.beginPath();
c.strokeStyle = r ? this.o.fgColor : this.fgColor ;
c.arc(this.xy, this.xy, this.radius, sat, eat, false);
c.stroke();
};
this.cancel = function () {
this.val(this.v);
};
};
$.fn.dial = $.fn.knob = function (o) {
return this.each(
function () {
var d = new k.Dial();
d.o = o;
d.$ = $(this);
d.run();
}
).parent();
};
})(jQuery); loopj-jquery-simple-slider-fa64f59/ 0000775 0000000 0000000 00000000000 12304627050 0041335 5 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/dashboard/static/dashboard loopj-jquery-simple-slider-fa64f59/.gitignore 0000664 0000000 0000000 00000000034 12304627050 0043322 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/dashboard/static/dashboard node_modules/
*.zip
gh-pages loopj-jquery-simple-slider-fa64f59/README.md 0000664 0000000 0000000 00000001302 12304627050 0042610 0 ustar 00root root 0000000 0000000 cloud-f6687581d925e645d32e2c2ba44199aee7980120-f6687581d925e645d32e2c2ba44199aee7980120/circle/dashboard/static/dashboard jQuery Simple Slider: Unobtrusive Numerical Slider
==================================================
SimpleSlider is a jQuery plugin for turning your text inputs into draggable
numerical sliders.
It has no external dependencies other than jQuery, and you don't need to write
a single line of JavaScript to get it to work.
How to Use
-----------
Include the javascript file in your page:
Turn your text input into a slider:
Documentation, Features and Demos
---------------------------------
Full details and documentation can be found on the project page here: