class Migration(migrations.Migration): initial = True dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name='AvatarImage', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=200)), ('pic', models.ImageField(upload_to='main/static/main/avatar_img')), ], ), migrations.CreateModel( name='Categories', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(help_text='Enter a lot category', max_length=200)), ], ), migrations.CreateModel( name='Image', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('title', models.CharField(max_length=200)), ('pic', models.ImageField(upload_to='main/static/main/lots_img')), ], ), migrations.CreateModel( name='Regions', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(help_text='Enter a lot region', max_length=200)), ], ), migrations.CreateModel( name='SOBE_Users', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('balance', models.IntegerField()), ('account', models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ('avatar_image', models.OneToOneField(null=True, on_delete=django.db.models.deletion.SET_NULL, to='main.avatarimage')), ], ), migrations.CreateModel( name='Sellers', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('user', models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, to='main.sobe_users')), ], ), migrations.CreateModel( name='Lots', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(help_text='Enter lot name', max_length=200)), ('description', models.TextField(blank=True, help_text='Enter lot description', max_length=1000)), ('count', models.PositiveIntegerField(help_text='Enter lot count')), ('price', models.FloatField(blank=True, help_text='Enter lot price')), ('date', models.DateField(blank=True, null=True)), ('category', models.ManyToManyField(help_text='Enter lot category', to='main.Categories')), ('image', models.OneToOneField(help_text='Enter lot image', null=True, on_delete=django.db.models.deletion.SET_NULL, to='main.image')), ('region', models.ManyToManyField(help_text='Enter lot region', to='main.Regions')), ('seller', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='main.sellers')), ], ), migrations.CreateModel( name='Dealings', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('date', models.DateField(blank=True, null=True)), ('price', models.FloatField(blank=True)), ('lot', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='main.lots')), ('seller', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='main.sellers')), ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='main.sobe_users')), ], ), ]
class Migration(migrations.Migration): initial = True dependencies = [] operations = [ migrations.CreateModel( name='Author', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('first_name', models.CharField(max_length=100)), ('last_name', models.CharField(max_length=100)), ('date_of_birth', models.DateField(blank=True, null=True)), ('date_of_death', models.DateField(blank=True, null=True, verbose_name='died')), ], ), migrations.CreateModel( name='Book', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('title', models.CharField(max_length=200)), ('summary', models.TextField( help_text='Enter a brief description of the book', max_length=1000)), ('isbn', models.CharField( help_text= '13 Character <a href="https://www.isbn-international.org/content/what-isbn">ISBN number</a>', max_length=13, verbose_name='ISBN')), ('author', models.ForeignKey( null=True, on_delete=django.db.models.deletion.SET_NULL, to='catalog.author')), ], ), migrations.CreateModel( name='Genre', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField( help_text= 'Enter a book genre (e.g. Science Fiction, French Poetry etc.)', max_length=200)), ], ), migrations.CreateModel( name='Language', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField( help_text= "Enter the book's natural language (e.g. English, French, Japanese etc.)", max_length=200)), ], ), migrations.CreateModel( name='BookInstance', fields=[ ('id', models.UUIDField( default=uuid.uuid4, help_text= 'Unique ID for this particular book across whole library', primary_key=True, serialize=False)), ('imprint', models.CharField(max_length=200)), ('due_back', models.DateField(blank=True, null=True)), ('status', models.CharField(blank=True, choices=[('m', 'Maintenance'), ('o', 'On loan'), ('a', 'Available'), ('r', 'Reserved')], default='m', help_text='Book availability', max_length=1)), ('book', models.ForeignKey( null=True, on_delete=django.db.models.deletion.SET_NULL, to='catalog.book')), ], ), migrations.AddField( model_name='book', name='genre', field=models.ManyToManyField( help_text='Select a genre for this book', to='catalog.Genre'), ), migrations.AddField( model_name='book', name='language', field=models.ForeignKey( null=True, on_delete=django.db.models.deletion.SET_NULL, to='catalog.language'), ), ]
class Genre(models.Model): def __str__(self): return "%s" % self.genre movie = models.ManyToManyField(Movie) genre = models.CharField('Genre', max_length=25, default='')
class Migration(migrations.Migration): initial = True dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name='category', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('category', models.CharField(max_length=200)), ], ), migrations.CreateModel( name='post', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('title', models.CharField(max_length=200)), ('timestamp', models.DateTimeField(auto_now_add=True)), ('content', models.TextField()), ('summary', models.TextField(blank=True, null=True)), ('image', models.ImageField(blank=True, null=True, upload_to='')), ('num_viwes', models.PositiveIntegerField(blank=True, default=0)), ('category', models.ManyToManyField(to='posts.category')), ('user', models.ForeignKey(default='mmg', on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], options={ 'ordering': ['-num_viwes'], }, ), migrations.CreateModel( name='comment', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('txt', models.TextField()), ('timestamp', models.DateTimeField(auto_now_add=True)), ('post', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='posts.post')), ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], ), ]
class Car(models.Model): make = models.CharField(max_length=20, unique=True, null=True) drivers = models.ManyToManyField('Driver', through='CarDriver') def __str__(self): return "%s" % self.make
class Lane(models.Model): library = models.ForeignKey(Library, on_delete=models.PROTECT) machine = models.ForeignKey(Machine, on_delete=models.PROTECT) flowcell = models.CharField(max_length=32) rundate = models.DateField() reads = models.IntegerField(null=True, blank=True) passedpf = models.IntegerField(null=True, blank=True) lanenum = models.IntegerField() flowlane = models.IntegerField() paired = models.BooleanField(default=False) readlength = models.IntegerField(null=True, blank=True) mapped = models.IntegerField(null=True, blank=True) facility = models.ForeignKey(Facility, on_delete=models.PROTECT) seqsamplepf = models.TextField(blank=True) seqsamplebad = models.TextField(blank=True) qualmeanpf = dbarray.FloatArrayField(null=True) qualstdevpf = dbarray.FloatArrayField(null=True) qualmean = dbarray.FloatArrayField(null=True) qualstdev = dbarray.FloatArrayField(null=True) summaryurl = models.CharField(max_length=1024, null=True, blank=True) genomicssampleid = models.CharField(max_length=32, null=True, blank=True) usersampleid = models.CharField(max_length=1024, null=True, blank=True) notes = models.TextField(null=True, blank=True) failed = models.BooleanField(default=False) runnumber = models.CharField(null=True, blank=True, max_length=255) status = models.ForeignKey(Status, on_delete=models.PROTECT) external_records = models.ManyToManyField(ExternalRecord, db_table='lane_external_record', related_name='lanes') objects = LaneManager() @property def total_passedpf(self): if self.paired and self.passedpf is not None: return self.passedpf * 2 else: return self.passedpf @property def total_reads(self): if self.paired and self.reads is not None: return self.reads * 2 else: return self.reads @property def name(self): return "%s%02d" % (self.facility, self.lanenum) @property def notes_formatted(self): if self.notes is None: return '' else: return "\n".join(self.notes.split(";")) @property def model_parent(self): return self.library @property def is_published(self): return any([x.is_public for x in self.external_records.all()]) @property def public_records(self): return [x for x in self.external_records.all() if x.is_public] def __unicode__(self): return "%s_%s%02d" % (self.library, self.facility, self.lanenum) class Meta: db_table = u'lane' unique_together = ('library', 'lanenum', 'facility') ordering = ['library']
class Products(models.Model): cus_id = models.ManyToManyField("Customer", ) cus_name = models.TextField() cus_qty = models.TextField(max_length=100)
class JobGroup(models.Model): title = models.CharField(max_length=1024, blank=False, null=False) jobs = models.ManyToManyField(Job, blank=True) def __unicode__(self): return self.title class Meta: ordering = ['-jobs__started']
class KeyFetchEvent(AuditEvent): keys_loaded = models.ManyToManyField(Key) def __str__(self): return "KeyFetchEvent { %s, %s, %s }" % (self.public_id, self.server, self.audit_type)
class Migration(migrations.Migration): dependencies = [ ('auth', '0006_require_contenttypes_0002'), ] operations = [ migrations.CreateModel( name='Article', fields=[ ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), ('article', models.TextField()), ], ), migrations.CreateModel( name='ArticleDescribe', fields=[ ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), ('title', models.CharField(max_length=40)), ('article_describe', models.CharField(max_length=255)), ('create_time', models.DateField()), ('comment_count', models.IntegerField()), ('up_count', models.IntegerField()), ('down_count', models.IntegerField()), ], ), migrations.CreateModel( name='ArticleDescribe2Label', fields=[ ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), ('article', models.ForeignKey(to='Go.ArticleDescribe')), ], ), migrations.CreateModel( name='ArticleUpDown', fields=[ ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), ('is_up', models.BooleanField(default=True)), ('article', models.ForeignKey(to='Go.ArticleDescribe')), ], ), migrations.CreateModel( name='Category', fields=[ ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), ('language', models.CharField(max_length=20)), ], ), migrations.CreateModel( name='Comment', fields=[ ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), ('create_time', models.DateTimeField()), ('content', models.CharField(max_length=225)), ('article', models.ForeignKey(to='Go.ArticleDescribe')), ('parent_id', models.ForeignKey(default=None, to='Go.Comment')), ], ), migrations.CreateModel( name='CommentUp', fields=[ ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), ('is_up', models.ForeignKey(null=True, to='Go.Comment')), ], ), migrations.CreateModel( name='Label', fields=[ ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), ('name', models.CharField(max_length=20)), ], ), migrations.CreateModel( name='Website', fields=[ ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), ('title', models.CharField(max_length=64)), ('site', models.CharField(max_length=32)), ('theme', models.CharField(max_length=23)), ], ), migrations.CreateModel( name='User', fields=[ ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), ('password', models.CharField(verbose_name='password', max_length=128)), ('last_login', models.DateTimeField(verbose_name='last login', blank=True, null=True)), ('is_superuser', models.BooleanField( verbose_name='superuser status', default=False, help_text= 'Designates that this user has all permissions without explicitly assigning them.' )), ('username', models.CharField( verbose_name='username', max_length=30, unique=True, help_text= 'Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.', validators=[ django.core.validators.RegexValidator( '^[\\w.@+-]+$', 'Enter a valid username. This value may contain only letters, numbers and @/./+/-/_ characters.', 'invalid') ], error_messages={ 'unique': 'A user with that username already exists.' })), ('first_name', models.CharField(verbose_name='first name', max_length=30, blank=True)), ('last_name', models.CharField(verbose_name='last name', max_length=30, blank=True)), ('email', models.EmailField(verbose_name='email address', max_length=254, blank=True)), ('is_staff', models.BooleanField( verbose_name='staff status', default=False, help_text= 'Designates whether the user can log into this admin site.' )), ('is_active', models.BooleanField( verbose_name='active', default=True, help_text= 'Designates whether this user should be treated as active. Unselect this instead of deleting accounts.' )), ('date_joined', models.DateTimeField(verbose_name='date joined', default=django.utils.timezone.now)), ('avatar', models.FileField(default='img/default.jpg', upload_to='Go/static/img/')), ('phone', models.CharField(max_length=11, unique=True, null=True)), ('groups', models.ManyToManyField( verbose_name='groups', blank=True, help_text= 'The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group')), ('user_permissions', models.ManyToManyField( verbose_name='user permissions', blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission')), ('userfans', models.ManyToManyField(related_name='userfans_rel_+', to=settings.AUTH_USER_MODEL)), ], options={ 'verbose_name': 'user', 'verbose_name_plural': 'users', 'abstract': False, }, managers=[ ('objects', django.contrib.auth.models.UserManager()), ], ), migrations.AddField( model_name='website', name='blog', field=models.OneToOneField(to=settings.AUTH_USER_MODEL), ), migrations.AddField( model_name='label', name='website', field=models.ForeignKey(to='Go.Website'), ), migrations.AddField( model_name='commentup', name='user', field=models.ForeignKey(null=True, to=settings.AUTH_USER_MODEL), ), migrations.AddField( model_name='comment', name='user', field=models.ForeignKey(to=settings.AUTH_USER_MODEL), ), migrations.AddField( model_name='category', name='website', field=models.ForeignKey(to='Go.Website'), ), migrations.AddField( model_name='articleupdown', name='user', field=models.ForeignKey(to=settings.AUTH_USER_MODEL), ), migrations.AddField( model_name='articledescribe2label', name='label', field=models.ForeignKey(to='Go.Label'), ), migrations.AddField( model_name='articledescribe', name='corresponding', field=models.ForeignKey(to='Go.Category'), ), migrations.AddField( model_name='articledescribe', name='lable', field=models.ManyToManyField(to='Go.Label', through='Go.ArticleDescribe2Label'), ), migrations.AddField( model_name='articledescribe', name='user', field=models.ForeignKey(to=settings.AUTH_USER_MODEL), ), migrations.AddField( model_name='article', name='articleDescribe', field=models.OneToOneField(to='Go.ArticleDescribe'), ), migrations.AlterUniqueTogether( name='articleupdown', unique_together=set([('article', 'user')]), ), migrations.AlterUniqueTogether( name='articledescribe2label', unique_together=set([('article', 'label')]), ), ]
class Migration(migrations.Migration): initial = True dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name='ArticleInfo', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('title', models.CharField(max_length=200, verbose_name='标题')), ('content', ckeditor_uploader.fields.RichTextUploadingField( verbose_name='内容')), ('articlephoto', models.ImageField(blank=True, upload_to='images/article/', verbose_name='文章图片')), ('reading', models.IntegerField(default=0, verbose_name='阅读量')), ('liking', models.IntegerField(default=0, verbose_name='点赞量')), ('created', models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间')), ('updated', models.DateTimeField(auto_now=True, verbose_name='更新时间')), ], options={ 'verbose_name': '博文管理', 'verbose_name_plural': '博文管理', }, ), migrations.CreateModel( name='Comment', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('commentator', models.CharField(max_length=50, verbose_name='评论用户')), ('content', models.TextField(verbose_name='评论内容')), ('created', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), ('article', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='article.ArticleInfo', verbose_name='所属文章')), ], options={ 'verbose_name': '评论管理', 'verbose_name_plural': '评论管理', }, ), migrations.CreateModel( name='ArticleTag', fields=[ ('id', models.AutoField(primary_key=True, serialize=False)), ('tag', models.CharField(max_length=200, verbose_name='标签')), ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='用户')), ], options={ 'verbose_name': '博文分类', 'verbose_name_plural': '博文分类', }, ), migrations.AddField( model_name='articleinfo', name='article_tag', field=models.ManyToManyField(blank=True, to='article.ArticleTag', verbose_name='文章标签'), ), migrations.AddField( model_name='articleinfo', name='author', field=models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='用户'), ), ]
class Student(models.Model, Person): grades = models.ManyToManyField(Grade) content = models.OneToOneField(ContentItemCollection)
class Project(models.Model): """ Stores a single project. """ name = models.CharField(max_length=100) description = models.TextField(null=True, blank=True) isprivate = models.BooleanField(default=False) created_at = models.DateTimeField(auto_now_add=True) creator = models.ForeignKey(settings.AUTH_USER_MODEL) everyone_contributes = models.CharField(choices=EVERYONE_CONTRIB, default=EVERYONE_CONTRIB.auth, max_length=20) status = models.CharField(choices=STATUS, default=STATUS.active, max_length=20) admins = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='admins', through='Admins') geographic_extend = gis.PolygonField(null=True, geography=True) objects = ProjectManager() class Meta: ordering = ['name'] def __str__(self): return '%s status: %s private: %s' % (self.name, self.status, self.isprivate) @classmethod def create(cls, name, description, isprivate, everyone_contributes, creator): """ Creates a new project. Creates two usergroups and adds the creator to the administrators user group. name : str Name of the project description : str Long-form description of the project isprivate : Boolean Indicates if the project should be private everyone_contributes : str Indicates if all you users who have access can contribute to the project Accepted: true - all users who have access, including anonymous auth - all user who are authenticated false - users need to be member of a user group Return ------ geokey.projects.models.Project """ project = cls(name=name, description=description, isprivate=isprivate, creator=creator, everyone_contributes=everyone_contributes) project.save() Admins.objects.create(project=project, user=creator) return project def delete(self): """ Deletes the project by setting its status to `DELETED`. Also deletes all Admin groups related to the project. """ Admins.objects.filter(project=self).delete() self.status = STATUS.deleted self.save() def re_order_categories(self, order): """ Reorders the categories according to the order given in `order` Parameters ---------- order : list ordered list of category IDs that define the new order """ categories_to_save = [] for idx, category_id in enumerate(order): category = self.categories.get(pk=category_id) category.order = idx categories_to_save.append(category) for category in categories_to_save: category.save() def get_role(self, user): """ Returns the user's role in plain text Parameters ---------- user : geokey.users.models.User User that is examined Returns ------- str Role of the user in the project """ if self.is_admin(user): return 'administrator' elif self.can_moderate(user): return 'moderator' elif self.can_contribute(user): return 'contributor' else: return 'watcher' def is_admin(self, user): """ Returns True if the user is member of the administrators group, False if not. Parameters ---------- user : geokey.users.models.User User that is examined Returns ------- Boolean Indicating if user is admin """ return user in self.admins.all() def can_access(self, user): """ Returns True if: - the user is member of the administrators group - the user is member of one of the usergroups - the project is public and has at least one public data grouping Parameters ---------- user : geokey.users.models.User User that is examined Returns ------- Boolean Indicating if user is can access """ return self.status == STATUS.active and ( self.is_admin(user) or (not self.isprivate and self.groupings.filter(isprivate=False).exists()) or (not user.is_anonymous() and (self.usergroups.filter(can_contribute=True, users=user).exists() or self.usergroups.filter(can_moderate=True, users=user).exists() or self.usergroups.filter(users=user, viewgroups__isnull=False).exists()))) def can_contribute(self, user): """ Returns True if: - the user is member of the administrators group - the user is member of one usergroup that has can_contribute granted - everyone_contributes is True Parameters ---------- user : geokey.users.models.User User that is examined Returns ------- Boolean Indicating if user can contribute """ return self.status == STATUS.active and ( (self.everyone_contributes != 'false' and (not user.is_anonymous() or not self.everyone_contributes == 'auth')) or self.is_admin(user) or (not user.is_anonymous() and (self.usergroups.filter( can_contribute=True, users=user).exists()))) def can_moderate(self, user): """ Returns True if the user is member of a user group with moderation rights Parameters ---------- user : geokey.users.models.User User that is examined Returns ------- Boolean Indicating if user can moderate """ return self.status == STATUS.active and ( self.is_admin(user) or (not user.is_anonymous() and (self.usergroups.filter(can_moderate=True, users=user).exists()))) def is_involved(self, user): """ Returns True if: - the user is member of the administrators group - the user is member of at least usergroup assigned to the project Parameters ---------- user : geokey.users.models.User User that is examined Returns ------- Boolean Indicating if user is involved """ return self.is_admin(user) or ( not user.is_anonymous() and (self.usergroups.filter(users=user).exists())) def get_all_contributions(self, user): """ Returns all contributions a user can access in a project. It gets the SQL clauses of all data groupings in the project and combines them to filter all contributions in the project. Parameters ---------- user : geokey.users.models.User User that contributions are queried for Returns ------- django.db.models.query.QuerySet List of geokey.contributions.models.Observations """ data = None if self.is_admin(user): # Return everything for admins return self.observations.for_moderator(user) elif self.can_moderate(user): data = self.observations.for_moderator(user) else: data = self.observations.for_viewer(user) grouping_queries = [ grouping.get_where_clause() for grouping in self.groupings.get_list(user, self.id) ] grouping_queries = [x for x in grouping_queries if x is not None] # Return everything found in data groupings plus the user's data if len(grouping_queries) > 0: query = '(' + ') OR ('.join(grouping_queries) + ')' if (not user.is_anonymous()): query = query + ' OR (creator_id = ' + str(user.id) + ')' return data.extra(where=[query]) # If there are no data groupings for the user, return just the user's # data if (not user.is_anonymous()): return self.observations.filter(creator=user) else: return self.observations.none() def contact_admins(self, sender, mail_content): """ Sends an email with `mail_content` to all admins of the project, that are contact persons. Parameters ---------- sender : str Email address of the user sending the request mail_content : str Email text of the request """ messages = [] email_text = get_template('contact_admins_email.txt') platform = Site.objects.get(pk=settings.SITE_ID).name for contact_admin in Admins.objects.filter(project=self, contact=True): context = Context({ 'sender': sender, 'admin': contact_admin.user, 'email_text': mail_content, 'project_name': self.name, 'platform': platform }) text = email_text.render(context) email = mail.EmailMessage('Enquiry from %s' % sender.display_name, text, sender.email, [contact_admin.user.email]) messages.append(email) if len(messages) > 0: connection = mail.get_connection() connection.open() connection.send_messages(messages) connection.close()
class Migration(migrations.Migration): dependencies = [ ('models', '0009_4_0_1'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('auth', '0008_alter_user_username_max_length'), ] operations = [ migrations.CreateModel( name='UserProfile', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('phone', models.CharField(blank=True, max_length=16)), ('user', models.OneToOneField( on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], options={ 'db_table': 'user_profile', 'managed': True, }, ), migrations.RunPython( code=forwards_func, reverse_code=reverse_func, ), migrations.CreateModel( name='MobileSurveyModel', fields=[ ('id', models.UUIDField(default=uuid.uuid1, primary_key=True, serialize=False)), ('name', models.TextField(null=True)), ('active', models.BooleanField(default=False)), ('startdate', models.DateField(blank=True, null=True)), ('enddate', models.DateField(blank=True, null=True)), ('description', models.TextField(null=True)), ], options={ 'db_table': 'mobile_surveys', 'managed': True, }, ), migrations.CreateModel( name='MobileSurveyXCard', fields=[ ('mobile_survey_x_card_id', models.UUIDField(default=uuid.uuid1, primary_key=True, serialize=False)), ('sortorder', models.IntegerField(default=0)), ('card', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='models.CardModel')), ('mobile_survey', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='models.MobileSurveyModel')), ], options={ 'db_table': 'mobile_surveys_x_cards', 'managed': True, }, ), migrations.CreateModel( name='MobileSurveyXGroup', fields=[ ('mobile_survey_x_group_id', models.UUIDField(default=uuid.uuid1, primary_key=True, serialize=False)), ('group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='auth.Group')), ('mobile_survey', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='models.MobileSurveyModel')), ], options={ 'db_table': 'mobile_surveys_x_groups', 'managed': True, }, ), migrations.CreateModel( name='MobileSurveyXUser', fields=[ ('mobile_survey_x_user_id', models.UUIDField(default=uuid.uuid1, primary_key=True, serialize=False)), ('mobile_survey', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='models.MobileSurveyModel')), ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], options={ 'db_table': 'mobile_surveys_x_users', 'managed': True, }, ), migrations.AddField( model_name='mobilesurveymodel', name='cards', field=models.ManyToManyField(through='models.MobileSurveyXCard', to=b'models.CardModel'), ), migrations.AddField( model_name='mobilesurveymodel', name='createdby', field=models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name='createdby', to=settings.AUTH_USER_MODEL), ), migrations.AddField( model_name='mobilesurveymodel', name='groups', field=models.ManyToManyField(through='models.MobileSurveyXGroup', to=b'auth.Group'), ), migrations.AddField( model_name='mobilesurveymodel', name='lasteditedby', field=models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name='lasteditedby', to=settings.AUTH_USER_MODEL), ), migrations.AddField( model_name='mobilesurveymodel', name='users', field=models.ManyToManyField(through='models.MobileSurveyXUser', to=settings.AUTH_USER_MODEL), ), migrations.CreateModel( name='MobileSurvey', fields=[], options={ 'proxy': True, 'indexes': [], }, bases=('models.mobilesurveymodel', ), ), migrations.AlterUniqueTogether( name='mobilesurveyxuser', unique_together=set([('mobile_survey', 'user')]), ), migrations.AlterUniqueTogether( name='mobilesurveyxgroup', unique_together=set([('mobile_survey', 'group')]), ), migrations.AlterUniqueTogether( name='mobilesurveyxcard', unique_together=set([('mobile_survey', 'card')]), ), migrations.RunSQL( sql= "\n update widgets\n \tset defaultconfig = (SELECT defaultconfig || jsonb_build_object('defaultValue', '') FROM widgets WHERE name = 'text-widget')\n \tWHERE name = 'text-widget';\n update cards_x_nodes_x_widgets\n \tset config = (SELECT config || jsonb_build_object('defaultValue', '') FROM widgets WHERE name = 'text-widget')\n \tWHERE widgetid in (SELECT widgetid FROM widgets WHERE name = 'text-widget');\n\n\n ", reverse_sql= "\n update widgets\n \tset defaultconfig = defaultconfig - 'defaultValue'\n \tWHERE name = 'text-widget';\n update cards_x_nodes_x_widgets\n \tset config = config - 'defaultValue'\n \tWHERE widgetid in (SELECT widgetid FROM widgets WHERE name = 'text-widget');\n ", ), migrations.RunSQL( sql= "\n update widgets\n \tset defaultconfig = (SELECT defaultconfig || jsonb_build_object('defaultValue', '') FROM widgets WHERE name = 'number-widget')\n \tWHERE name = 'number-widget';\n update cards_x_nodes_x_widgets\n \tset config = (SELECT config || jsonb_build_object('defaultValue', '') FROM widgets WHERE name = 'number-widget')\n \tWHERE widgetid in (SELECT widgetid FROM widgets WHERE name = 'number-widget');\n\n\n ", reverse_sql= "\n update widgets\n \tset defaultconfig = defaultconfig - 'defaultValue'\n \tWHERE name = 'number-widget';\n update cards_x_nodes_x_widgets\n \tset config = config - 'defaultValue'\n \tWHERE widgetid in (SELECT widgetid FROM widgets WHERE name = 'number-widget');\n ", ), migrations.RunSQL( sql= "\n update widgets\n \tset defaultconfig = (SELECT defaultconfig || jsonb_build_object('defaultValue', '') FROM widgets WHERE name = 'radio-boolean-widget')\n \tWHERE name = 'radio-boolean-widget';\n update cards_x_nodes_x_widgets\n \tset config = (SELECT config || jsonb_build_object('defaultValue', '') FROM widgets WHERE name = 'radio-boolean-widget')\n \tWHERE widgetid in (SELECT widgetid FROM widgets WHERE name = 'radio-boolean-widget');\n\n\n ", reverse_sql= "\n update widgets\n \tset defaultconfig = defaultconfig - 'defaultValue'\n \tWHERE name = 'radio-boolean-widget';\n update cards_x_nodes_x_widgets\n \tset config = config - 'defaultValue'\n \tWHERE widgetid in (SELECT widgetid FROM widgets WHERE name = 'radio-boolean-widget');\n ", ), migrations.RunSQL( sql= "\n update widgets\n set defaultconfig = (SELECT defaultconfig || jsonb_build_object('defaultValue', '') FROM widgets WHERE name = 'switch-widget')\n WHERE name = 'switch-widget';\n update cards_x_nodes_x_widgets\n set config = (SELECT config || jsonb_build_object('defaultValue', '') FROM widgets WHERE name = 'switch-widget')\n WHERE widgetid in (SELECT widgetid FROM widgets WHERE name = 'switch-widget');\n\n\n ", reverse_sql= "\n update widgets\n set defaultconfig = defaultconfig - 'defaultValue'\n WHERE name = 'switch-widget';\n update cards_x_nodes_x_widgets\n set config = config - 'defaultValue'\n WHERE widgetid in (SELECT widgetid FROM widgets WHERE name = 'switch-widget');\n ", ), migrations.RunSQL( sql= "\n update widgets\n \tset defaultconfig = (SELECT defaultconfig || jsonb_build_object('defaultValue', '') FROM widgets WHERE name = 'domain-select-widget')\n \tWHERE name = 'domain-select-widget';\n update cards_x_nodes_x_widgets\n \tset config = (SELECT config || jsonb_build_object('defaultValue', '') FROM widgets WHERE name = 'domain-select-widget')\n \tWHERE widgetid in (SELECT widgetid FROM widgets WHERE name = 'domain-select-widget');\n\n\n ", reverse_sql= "\n update widgets\n \tset defaultconfig = defaultconfig - 'defaultValue'\n \tWHERE name = 'domain-select-widget';\n update cards_x_nodes_x_widgets\n \tset config = config - 'defaultValue'\n \tWHERE widgetid in (SELECT widgetid FROM widgets WHERE name = 'domain-select-widget');\n ", ), migrations.RunSQL( sql= "\n update widgets\n set defaultconfig = (SELECT defaultconfig || jsonb_build_object('defaultValue', '') FROM widgets WHERE name = 'domain-radio-widget')\n WHERE name = 'domain-radio-widget';\n update cards_x_nodes_x_widgets\n set config = (SELECT config || jsonb_build_object('defaultValue', '') FROM widgets WHERE name = 'domain-radio-widget')\n WHERE widgetid in (SELECT widgetid FROM widgets WHERE name = 'domain-radio-widget');\n\n\n ", reverse_sql= "\n update widgets\n set defaultconfig = defaultconfig - 'defaultValue'\n WHERE name = 'domain-radio-widget';\n update cards_x_nodes_x_widgets\n set config = config - 'defaultValue'\n WHERE widgetid in (SELECT widgetid FROM widgets WHERE name = 'domain-radio-widget');\n ", ), migrations.RunSQL( sql= "\n update widgets\n set defaultconfig = (SELECT defaultconfig || jsonb_build_object('defaultValue', '') FROM widgets WHERE name = 'domain-multiselect-widget')\n WHERE name = 'domain-multiselect-widget';\n update cards_x_nodes_x_widgets\n set config = (SELECT config || jsonb_build_object('defaultValue', '') FROM widgets WHERE name = 'domain-multiselect-widget')\n WHERE widgetid in (SELECT widgetid FROM widgets WHERE name = 'domain-multiselect-widget');\n\n\n ", reverse_sql= "\n update widgets\n set defaultconfig = defaultconfig - 'defaultValue'\n WHERE name = 'domain-multiselect-widget';\n update cards_x_nodes_x_widgets\n set config = config - 'defaultValue'\n WHERE widgetid in (SELECT widgetid FROM widgets WHERE name = 'domain-multiselect-widget');\n ", ), migrations.RunSQL( sql= "\n update widgets\n set defaultconfig = (SELECT defaultconfig || jsonb_build_object('defaultValue', '') FROM widgets WHERE name = 'domain-checkbox-widget')\n WHERE name = 'domain-checkbox-widget';\n update cards_x_nodes_x_widgets\n set config = (SELECT config || jsonb_build_object('defaultValue', '') FROM widgets WHERE name = 'domain-checkbox-widget')\n WHERE widgetid in (SELECT widgetid FROM widgets WHERE name = 'domain-checkbox-widget');\n\n\n ", reverse_sql= "\n update widgets\n set defaultconfig = defaultconfig - 'defaultValue'\n WHERE name = 'domain-checkbox-widget';\n update cards_x_nodes_x_widgets\n set config = config - 'defaultValue'\n WHERE widgetid in (SELECT widgetid FROM widgets WHERE name = 'domain-checkbox-widget');\n ", ), migrations.RunSQL( sql= "\n update widgets\n \tset defaultconfig = (SELECT defaultconfig || jsonb_build_object('defaultValue', '') FROM widgets WHERE name = 'concept-select-widget')\n \tWHERE name = 'concept-select-widget';\n update cards_x_nodes_x_widgets\n \tset config = (SELECT config || jsonb_build_object('defaultValue', '') FROM widgets WHERE name = 'concept-select-widget')\n \tWHERE widgetid in (SELECT widgetid FROM widgets WHERE name = 'concept-select-widget');\n\n\n ", reverse_sql= "\n update widgets\n \tset defaultconfig = defaultconfig - 'defaultValue'\n \tWHERE name = 'concept-select-widget';\n update cards_x_nodes_x_widgets\n \tset config = config - 'defaultValue'\n \tWHERE widgetid in (SELECT widgetid FROM widgets WHERE name = 'concept-select-widget');\n ", ), migrations.RunSQL( sql= "\n update widgets\n set defaultconfig = (SELECT defaultconfig || jsonb_build_object('defaultValue', '') FROM widgets WHERE name = 'concept-radio-widget')\n WHERE name = 'concept-radio-widget';\n update cards_x_nodes_x_widgets\n set config = (SELECT config || jsonb_build_object('defaultValue', '') FROM widgets WHERE name = 'concept-radio-widget')\n WHERE widgetid in (SELECT widgetid FROM widgets WHERE name = 'concept-radio-widget');\n\n\n ", reverse_sql= "\n update widgets\n set defaultconfig = defaultconfig - 'defaultValue'\n WHERE name = 'concept-radio-widget';\n update cards_x_nodes_x_widgets\n set config = config - 'defaultValue'\n WHERE widgetid in (SELECT widgetid FROM widgets WHERE name = 'concept-radio-widget');\n ", ), migrations.RunSQL( sql= "\n update widgets\n set defaultconfig = (SELECT defaultconfig || jsonb_build_object('defaultValue', '') FROM widgets WHERE name = 'concept-multiselect-widget')\n WHERE name = 'concept-multiselect-widget';\n update cards_x_nodes_x_widgets\n set config = (SELECT config || jsonb_build_object('defaultValue', '') FROM widgets WHERE name = 'concept-multiselect-widget')\n WHERE widgetid in (SELECT widgetid FROM widgets WHERE name = 'concept-multiselect-widget');\n\n\n ", reverse_sql= "\n update widgets\n set defaultconfig = defaultconfig - 'defaultValue'\n WHERE name = 'concept-multiselect-widget';\n update cards_x_nodes_x_widgets\n set config = config - 'defaultValue'\n WHERE widgetid in (SELECT widgetid FROM widgets WHERE name = 'concept-multiselect-widget');\n ", ), migrations.RunSQL( sql= "\n update widgets\n set defaultconfig = (SELECT defaultconfig || jsonb_build_object('defaultValue', '') FROM widgets WHERE name = 'concept-checkbox-widget')\n WHERE name = 'concept-checkbox-widget';\n update cards_x_nodes_x_widgets\n set config = (SELECT config || jsonb_build_object('defaultValue', '') FROM widgets WHERE name = 'concept-checkbox-widget')\n WHERE widgetid in (SELECT widgetid FROM widgets WHERE name = 'concept-checkbox-widget');\n\n\n ", reverse_sql= "\n update widgets\n set defaultconfig = defaultconfig - 'defaultValue'\n WHERE name = 'concept-checkbox-widget';\n update cards_x_nodes_x_widgets\n set config = config - 'defaultValue'\n WHERE widgetid in (SELECT widgetid FROM widgets WHERE name = 'concept-checkbox-widget');\n ", ), migrations.RunSQL( sql= "\n update widgets\n \tset defaultconfig = (SELECT defaultconfig || jsonb_build_object('defaultValue', '') FROM widgets WHERE name = 'datepicker-widget')\n \tWHERE name = 'datepicker-widget';\n update cards_x_nodes_x_widgets\n \tset config = (SELECT config || jsonb_build_object('defaultValue', '') FROM widgets WHERE name = 'datepicker-widget')\n \tWHERE widgetid in (SELECT widgetid FROM widgets WHERE name = 'datepicker-widget');\n\n\n ", reverse_sql= "\n update widgets\n \tset defaultconfig = defaultconfig - 'defaultValue'\n \tWHERE name = 'datepicker-widget';\n update cards_x_nodes_x_widgets\n \tset config = config - 'defaultValue'\n \tWHERE widgetid in (SELECT widgetid FROM widgets WHERE name = 'datepicker-widget');\n ", ), migrations.AddField( model_name='mobilesurveymodel', name='datadownload', field=models.BooleanField(default=False), ), migrations.RunSQL( sql= '\n update widgets set defaultconfig = \'{"max":"","defaultValue":"","placeholder":"Enter number","width":"100%","min":"", "step":"", "precision":"", "prefix":"", "suffix":""}\' where name = \'number-widget\';\n\n update cards_x_nodes_x_widgets\n set config = (SELECT config || jsonb_build_object(\'step\', \'\') FROM widgets WHERE name = \'number-widget\')\n WHERE widgetid in (SELECT widgetid FROM widgets WHERE name = \'number-widget\');\n update cards_x_nodes_x_widgets\n set config = (SELECT config || jsonb_build_object(\'precision\', \'\') FROM widgets WHERE name = \'number-widget\')\n WHERE widgetid in (SELECT widgetid FROM widgets WHERE name = \'number-widget\');\n update cards_x_nodes_x_widgets\n set config = (SELECT config || jsonb_build_object(\'prefix\', \'\') FROM widgets WHERE name = \'number-widget\')\n WHERE widgetid in (SELECT widgetid FROM widgets WHERE name = \'number-widget\');\n update cards_x_nodes_x_widgets\n set config = (SELECT config || jsonb_build_object(\'suffix\', \'\') FROM widgets WHERE name = \'number-widget\')\n WHERE widgetid in (SELECT widgetid FROM widgets WHERE name = \'number-widget\');\n ', reverse_sql= "\n update widgets set defaultconfig = defaultconfig - 'step' WHERE name = 'number-widget';\n update widgets set defaultconfig = defaultconfig - 'precision' WHERE name = 'number-widget';\n update widgets set defaultconfig = defaultconfig - 'prefix' WHERE name = 'number-widget';\n update widgets set defaultconfig = defaultconfig - 'suffix' WHERE name = 'number-widget';\n update cards_x_nodes_x_widgets set config = config - 'step' WHERE widgetid in (SELECT widgetid FROM widgets WHERE name = 'number-widget');\n update cards_x_nodes_x_widgets set config = config - 'precision' WHERE widgetid in (SELECT widgetid FROM widgets WHERE name = 'number-widget');\n update cards_x_nodes_x_widgets set config = config - 'prefix' WHERE widgetid in (SELECT widgetid FROM widgets WHERE name = 'number-widget');\n update cards_x_nodes_x_widgets set config = config - 'suffix' WHERE widgetid in (SELECT widgetid FROM widgets WHERE name = 'number-widget');\n ", ), migrations.RunSQL( sql= "\n update widgets\n \tset defaultconfig = (SELECT defaultconfig || jsonb_build_object('defaultValue', '') FROM widgets WHERE name = 'map-widget')\n \tWHERE name = 'map-widget';\n update cards_x_nodes_x_widgets\n \tset config = (SELECT config || jsonb_build_object('defaultValue', '') FROM widgets WHERE name = 'map-widget')\n \tWHERE widgetid in (SELECT widgetid FROM widgets WHERE name = 'map-widget');\n\n update widgets\n set defaultconfig = (SELECT defaultconfig || jsonb_build_object('defaultValueType', '') FROM widgets WHERE name = 'map-widget')\n WHERE name = 'map-widget';\n update cards_x_nodes_x_widgets\n set config = (SELECT config || jsonb_build_object('defaultValueType', '') FROM widgets WHERE name = 'map-widget')\n WHERE widgetid in (SELECT widgetid FROM widgets WHERE name = 'map-widget');\n ", reverse_sql= "\n update widgets\n \tset defaultconfig = defaultconfig - 'defaultValue'\n \tWHERE name = 'map-widget';\n update widgets\n \tset defaultconfig = defaultconfig - 'defaultValueType'\n \tWHERE name = 'map-widget';\n update cards_x_nodes_x_widgets\n \tset config = config - 'defaultValue'\n \tWHERE widgetid in (SELECT widgetid FROM widgets WHERE name = 'map-widget');\n update cards_x_nodes_x_widgets\n \tset config = config - 'defaultValueType'\n \tWHERE widgetid in (SELECT widgetid FROM widgets WHERE name = 'map-widget');\n ", ), migrations.RunSQL( sql= '\n update widgets\n \tset defaultconfig = (SELECT defaultconfig || jsonb_build_object(\'defaultValue\',null) FROM widgets WHERE name = \'radio-boolean-widget\')\n \tWHERE name = \'radio-boolean-widget\';\n update cards_x_nodes_x_widgets\n \tset config = (SELECT config || jsonb_build_object(\'defaultValue\', null) FROM widgets WHERE name = \'radio-boolean-widget\')\n \tWHERE widgetid in (SELECT widgetid FROM widgets WHERE name = \'radio-boolean-widget\') and config @> \'{"defaultValue":""}\';\n\n ', reverse_sql= '\n update widgets\n \tset defaultconfig = (SELECT defaultconfig || jsonb_build_object(\'defaultValue\',\'\') FROM widgets WHERE name = \'radio-boolean-widget\')\n \tWHERE name = \'radio-boolean-widget\';\n update cards_x_nodes_x_widgets\n \tset config = (SELECT config || jsonb_build_object(\'defaultValue\', \'\') FROM widgets WHERE name = \'radio-boolean-widget\')\n \tWHERE widgetid in (SELECT widgetid FROM widgets WHERE name = \'radio-boolean-widget\') and config @> \'{"defaultValue":null}\';\n ', ), migrations.RunSQL( sql= '\n update widgets\n \tset defaultconfig = (SELECT defaultconfig || jsonb_build_object(\'defaultValue\',null) FROM widgets WHERE name = \'switch-widget\')\n \tWHERE name = \'switch-widget\';\n update cards_x_nodes_x_widgets\n \tset config = (SELECT config || jsonb_build_object(\'defaultValue\', null) FROM widgets WHERE name = \'switch-widget\')\n \tWHERE widgetid in (SELECT widgetid FROM widgets WHERE name = \'switch-widget\') and config @> \'{"defaultValue":""}\';\n\n ', reverse_sql= '\n update widgets\n \tset defaultconfig = (SELECT defaultconfig || jsonb_build_object(\'defaultValue\',\'\') FROM widgets WHERE name = \'switch-widget\')\n \tWHERE name = \'switch-widget\';\n update cards_x_nodes_x_widgets\n \tset config = (SELECT config || jsonb_build_object(\'defaultValue\', \'\') FROM widgets WHERE name = \'switch-widget\')\n \tWHERE widgetid in (SELECT widgetid FROM widgets WHERE name = \'switch-widget\') and config @> \'{"defaultValue":null}\';\n ', ), migrations.AddField( model_name='mobilesurveymodel', name='bounds', field=django.contrib.gis.db.models.fields.MultiPolygonField( null=True, srid=4326), ), migrations.AddField( model_name='mobilesurveymodel', name='tilecache', field=models.TextField(null=True), ), migrations.AddField( model_name='mobilesurveymodel', name='datadownloadconfig', field=django.contrib.postgres.fields.jsonb.JSONField( blank=True, default= '{"download":false, "count":1000, "resources":[], "custom":null}', null=True), ), migrations.RemoveField( model_name='mobilesurveymodel', name='datadownload', ), migrations.RunSQL( sql= '\n INSERT INTO d_data_types(\n datatype, iconclass, modulename,\n classname, defaultconfig, configcomponent,\n configname, isgeometric, defaultwidget,\n issearchable\n ) VALUES (\n \'node-value\',\n \'fa fa-external-link-square\',\n \'datatypes.py\',\n \'NodeValueDataType\',\n \'{\n "nodeid": null,\n "property": null\n }\',\n \'views/components/datatypes/node-value\',\n \'node-value-datatype-config\',\n FALSE,\n \'f5d6b190-bbf0-4dc9-b991-1debab8cb4a9\',\n FALSE\n );\n\n INSERT INTO widgets(\n widgetid,\n name,\n component,\n datatype,\n defaultconfig\n ) VALUES (\n \'f5d6b190-bbf0-4dc9-b991-1debab8cb4a9\',\n \'node-value-select\',\n \'views/components/widgets/node-value-select\',\n \'node-value\',\n \'{\n "placeholder": ""\n }\'\n );\n ', reverse_sql= "\n DELETE FROM d_data_types\n WHERE datatype = 'node-value';\n\n DELETE from widgets\n WHERE widgetid = 'f5d6b190-bbf0-4dc9-b991-1debab8cb4a9';\n ", ), migrations.RunSQL( sql= "\n UPDATE d_data_types\n SET defaultconfig = jsonb_build_object('trueLabel', 'Yes', 'falseLabel', 'No') || COALESCE(defaultconfig, '{}'::jsonb)\n WHERE datatype = 'boolean';\n --\n UPDATE widgets\n SET defaultconfig = defaultconfig - 'falseLabel'\n WHERE name = 'radio-boolean-widget';\n\n UPDATE widgets\n SET defaultconfig = defaultconfig - 'trueLabel'\n WHERE name = 'radio-boolean-widget';\n --\n UPDATE nodes AS n\n SET config = COALESCE(n.config, '{}'::jsonb) || jsonb_build_object('trueLabel', c.config->>'trueLabel', 'falseLabel', c.config->>'falseLabel')\n FROM cards_x_nodes_x_widgets AS c\n WHERE n.nodeid = c.nodeid\n AND n.datatype = 'boolean';\n --\n UPDATE cards_x_nodes_x_widgets\n SET config = config - 'falseLabel'\n WHERE nodeid in (SELECT nodeid from nodes WHERE datatype = 'boolean');\n\n UPDATE cards_x_nodes_x_widgets\n SET config = config - 'trueLabel'\n WHERE nodeid in (SELECT nodeid from nodes WHERE datatype = 'boolean');\n\n ", reverse_sql= "\n UPDATE d_data_types\n SET defaultconfig = defaultconfig - 'trueLabel'\n WHERE datatype = 'boolean';\n\n UPDATE d_data_types\n SET defaultconfig = defaultconfig - 'falseLabel'\n WHERE datatype = 'boolean';\n --\n UPDATE widgets\n SET defaultconfig = COALESCE(defaultconfig, '{}'::jsonb) || jsonb_build_object('trueLabel', 'Yes', 'falseLabel', 'No')\n WHERE name = 'radio-boolean-widget';\n --\n UPDATE nodes\n SET config = config - 'trueLabel'\n WHERE datatype = 'boolean';\n\n UPDATE nodes\n SET config = config - 'falseLabel'\n WHERE datatype = 'boolean';\n --\n UPDATE cards_x_nodes_x_widgets AS n\n SET config = COALESCE(n.config, '{}'::jsonb) || jsonb_build_object('trueLabel', c.config->>'trueLabel', 'falseLabel', c.config->>'falseLabel')\n FROM nodes AS c\n WHERE n.nodeid = c.nodeid\n AND c.datatype = 'boolean';\n ", ), migrations.RunSQL( sql= "\n update nodes n\n \tset config = jsonb_set(config, '{graphid}', (\n \t\tselect jsonb_agg(config->'graphid')\n \t\tfrom nodes n1\n \t\twhere n1.nodeid = n.nodeid\n \t))\n \twhere datatype in ('resource-instance', 'resource-instance-list')\n \tand config->'graphid' is not null;\n ", reverse_sql= "\n update nodes n\n \tset config = jsonb_set(config, '{graphid}', config->'graphid'->0)\n \twhere datatype in ('resource-instance', 'resource-instance-list')\n \tand config->'graphid' is not null;\n ", ), migrations.RunSQL( sql= "\n DELETE FROM public.geocoders WHERE geocoderid = '10000000-0000-0000-0000-010000000001';\n DELETE FROM public.map_sources WHERE name = 'mapzen';\n DELETE FROM public.map_layers WHERE name = 'mapzen';\n ", reverse_sql= '\n INSERT INTO public.geocoders(geocoderid, name, component) VALUES (\'10000000-0000-0000-0000-010000000001\', \'Mapzen\', \'views/components/geocoders/mapzen\');\n INSERT INTO map_sources(name, source)\n VALUES (\'mapzen\', \'{\n "type": "vector",\n "tiles": ["https://vector.mapzen.com/osm/all/{z}/{x}/{y}.mvt?api_key=vector-tiles-LM25tq4"]\n }\');\n INSERT INTO map_layers(maplayerid, name, layerdefinitions, isoverlay, icon, activated, addtomap)\n VALUES (public.uuid_generate_v1mc(), \'mapzen\', \'\n [\n {\n "id": "background",\n "type": "background",\n "paint": {\n "background-color": "#ededed"\n }\n }, {\n "id": "water-line",\n "source": "mapzen",\n "source-layer": "water",\n "type": "line",\n "filter": ["==", "$type", "LineString"],\n "paint": {\n "line-color": "#7acad0",\n "line-width": {\n "base": 1.2,\n "stops": [[8, 0.5], [20, 15]]\n }\n }\n }, {\n "id": "water-polygon",\n "source": "mapzen",\n "source-layer": "water",\n "type": "fill",\n "filter": ["==", "$type", "Polygon"],\n "paint": {\n "fill-color": "#7acad0"\n }\n }, {\n "id": "park",\n "type": "fill",\n "source": "mapzen",\n "source-layer": "landuse",\n "minzoom": 6,\n "filter": ["in", "kind", "park", "forest", "garden", "grass", "farm", "meadow", "playground", "golf_course", "nature_reserve", "wetland", "wood", "cemetery"],\n "paint": {\n "fill-color": "#c2cd44"\n }\n }, {\n "id": "river",\n "source": "mapzen",\n "source-layer": "water",\n "type": "line",\n "minzoom": 6,\n "filter": ["all", ["==", "$type", "LineString"], ["==", "kind", "river"]],\n "layout": {\n "line-cap": "round",\n "line-join": "round"\n },\n "paint": {\n "line-color": "#7acad0",\n "line-width": {\n "base": 1.2,\n "stops": [[8, 0.75], [20, 15]]\n }\n }\n }, {\n "id": "stream-etc",\n "source": "mapzen",\n "source-layer": "water",\n "type": "line",\n "minzoom": 11,\n "filter": ["all", ["==", "$type", "LineString"], ["==", "kind", "stream"]],\n "layout": {\n "line-cap": "round",\n "line-join": "round"\n },\n "paint": {\n "line-color": "#7acad0",\n "line-width": {\n "base": 1.4,\n "stops": [[10, 0.5], [20, 15]]\n }\n }\n }, {\n "id": "country-boundary",\n "source": "mapzen",\n "source-layer": "places",\n "type": "line",\n "filter": ["==", "admin_level", "2"],\n "maxzoom": 4,\n "layout": {\n "line-cap": "round",\n "line-join": "round"\n },\n "paint": {\n "line-color": "#afd3d3",\n "line-width": {\n "base": 2,\n "stops": [[1, 0.5], [7, 3]]\n }\n }\n }, {\n "id": "state-boundary",\n "source": "mapzen",\n "source-layer": "places",\n "type": "fill",\n "filter": ["==", "admin_level", "4"],\n "maxzoom": 10,\n "paint": {\n "fill-color": "#ededed",\n "fill-outline-color": "#cacecc"\n }\n }, {\n "id": "subways",\n "source": "mapzen",\n "source-layer": "roads",\n "type": "line",\n "paint": {\n "line-color": "#ef7369",\n "line-dasharray": [2, 1]\n },\n "filter": ["==", "railway", "subway"]\n }, {\n "id": "link-tunnel",\n "source": "mapzen",\n "source-layer": "roads",\n "type": "line",\n "filter": ["any",["==", "is_tunnel", "yes"]],\n "layout": {\n "line-join": "round",\n "line-cap": "round"\n },\n "paint": {\n "line-color": "#afd3d3",\n "line-width": {\n "base": 1.55,\n "stops": [[4, 0.25], [20, 30]]\n },\n "line-dasharray": [1, 2]\n }\n }, {\n "id": "buildings",\n "type": "fill",\n "source": "mapzen",\n "source-layer": "buildings",\n "paint": {\n "fill-outline-color": "#afd3d3",\n "fill-color": "#ededed"\n }\n }, {\n "id": "road",\n "source": "mapzen",\n "source-layer": "roads",\n "type": "line",\n "filter": ["any",["==", "kind", "minor_road"],["==", "kind", "major_road"]],\n "layout": {\n "line-join": "round",\n "line-cap": "round"\n },\n "paint": {\n "line-color": "#c0c4c2",\n "line-width": {\n "base": 1.55,\n "stops": [[4, 0.25], [20, 30]]\n }\n }\n }, {\n "id": "link-bridge",\n "source": "mapzen",\n "source-layer": "roads",\n "type": "line",\n "filter": ["any",["==", "is_link", "yes"], ["==", "is_bridge", "yes"]],\n "layout": {\n "line-join": "round",\n "line-cap": "round"\n },\n "paint": {\n "line-color": "#c0c4c2",\n "line-width": {\n "base": 1.55,\n "stops": [[4, 0.5], [8, 1.5], [20, 40]]\n }\n }\n }, {\n "id": "highway",\n "source": "mapzen",\n "source-layer": "roads",\n "type": "line",\n "filter": ["==", "kind", "highway"],\n "layout": {\n "line-join": "round",\n "line-cap": "round"\n },\n "paint": {\n "line-color": "#5d6765",\n "line-width": {\n "base": 1.55,\n "stops": [[4, 0.5], [8, 1.5], [20, 40]]\n }\n }\n }, {\n "id": "path",\n "source": "mapzen",\n "source-layer": "roads",\n "type": "line",\n "filter": ["==", "kind", "path"],\n "layout": {\n "line-join": "round",\n "line-cap": "round"\n },\n "minzoom": 12,\n "paint": {\n "line-color": "#5d6765",\n "line-width": {\n "base": 1.8,\n "stops": [[10, 0.15], [20, 15]]\n },\n "line-dasharray": [2, 2]\n }\n }, {\n "id": "ocean-label",\n "source": "mapzen",\n "source-layer": "places",\n "type": "symbol",\n "minzoom": 2,\n "maxzoom": 6,\n "filter": ["==", "kind", "ocean"],\n "layout": {\n "text-field": "{name}",\n "text-font": ["Open Sans Italic", "Arial Unicode MS Regular"],\n "text-max-width": 14,\n "text-letter-spacing": 0.1\n },\n "paint": {\n "text-color": "#ededed",\n "text-halo-color": "rgba(0,0,0,0.2)"\n }\n }, {\n "id": "other-label",\n "source": "mapzen",\n "source-layer": "places",\n "filter": ["all", ["==", "$type", "Point"], ["==", "kind", "neighbourhood"]],\n "minzoom": 12,\n "type": "symbol",\n "layout": {\n "text-field": "{name}",\n "text-font": ["Open Sans Semibold", "Arial Unicode MS Bold"],\n "text-max-width": 10\n },\n "paint": {\n "text-color": "#cb4b49",\n "text-halo-color": "rgba(255,255,255,0.5)"\n }\n }, {\n "id": "city-label",\n "source": "mapzen",\n "source-layer": "places",\n "filter": ["all", ["==", "$type", "Point"], ["==", "kind", "city"]],\n "minzoom": 10,\n "maxzoom": 14,\n "type": "symbol",\n "layout": {\n "text-field": "{name}",\n "text-font": ["Open Sans Semibold", "Arial Unicode MS Bold"],\n "text-max-width": 10,\n "text-letter-spacing": 0.1\n },\n "paint": {\n "text-color": "#384646",\n "text-halo-color": "rgba(255,255,255,0.5)"\n }\n }, {\n "id": "state-label",\n "source": "mapzen",\n "source-layer": "places",\n "filter": ["all", ["==", "$type", "Point"], ["==", "kind", "state"]],\n "minzoom": 6,\n "maxzoom": 12,\n "type": "symbol",\n "layout": {\n "text-field": "{name}",\n "text-font": ["Open Sans Regular", "Arial Unicode MS Regular"],\n "text-max-width": 8\n },\n "paint": {\n "text-color": "#f27a87",\n "text-halo-color": "rgba(255,255,255,0.5)"\n }\n }, {\n "id": "country-label",\n "source": "mapzen",\n "source-layer": "places",\n "filter": ["all", ["==", "$type", "Point"], ["==", "kind", "country"]],\n "maxzoom": 7,\n "type": "symbol",\n "layout": {\n "text-field": "{name}",\n "text-font": ["Open Sans Semibold", "Arial Unicode MS Bold"],\n "text-max-width": 4\n },\n "paint": {\n "text-color": "#cb4b49",\n "text-halo-color": "rgba(255,255,255,0.5)"\n }\n }\n ]\n\n \', FALSE, \'\', TRUE, FALSE);\n ', ), migrations.RunSQL( sql= "\n DELETE FROM functions_x_graphs WHERE functionid = '60000000-0000-0000-0000-000000000000';\n DELETE FROM functions WHERE functionid = '60000000-0000-0000-0000-000000000000';\n ", reverse_sql= "\n INSERT INTO functions(functionid, modulename, classname, functiontype, name, description, defaultconfig, component)\n VALUES ('60000000-0000-0000-0000-000000000000', 'local_file_storage.py', 'LocalFileStorageFunction', 'node', 'Local File Upload', 'Sets the default storage mechanism for uploaded files', '{}', 'views/components/functions/local-file-storage');\n ", ), migrations.RunSQL( sql= '\n update cards_x_nodes_x_widgets SET config = jsonb_set(config, \'{geocodeProvider}\', \'"10000000-0000-0000-0000-010000000000"\') where config @> \'{"geocodeProvider": "10000000-0000-0000-0000-010000000001"}\' or config @> \'{"geocodeProvider": "MapzenGeocoder"}\';\n ', reverse_sql= '\n update cards_x_nodes_x_widgets SET config = jsonb_set(config, \'{geocodeProvider}\', \'"10000000-0000-0000-0000-010000000001"\') where config @> \'{"geocodeProvider": "10000000-0000-0000-0000-010000000000"}\';\n ', ), ]
class Migration(migrations.Migration): initial = True dependencies = [ ('store', '0001_initial'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name='Category', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=255, unique=True)), ('num_chasers', models.DecimalField(decimal_places=0, default=0, max_digits=20)), ('chasers', models.ManyToManyField(blank=True, related_name='chased_categories', to=settings.AUTH_USER_MODEL)), ], options={ 'ordering': ('-num_chasers',), }, ), migrations.CreateModel( name='Subcategory', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=255, unique=True)), ('num_chasers', models.DecimalField(decimal_places=0, default=0, max_digits=20)), ('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='subcategories', to='product.Category')), ('chasers', models.ManyToManyField(blank=True, related_name='chased_subcategories', to=settings.AUTH_USER_MODEL)), ], options={ 'ordering': ('-num_chasers',), }, ), migrations.CreateModel( name='Product', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('special', models.BooleanField(default=False)), ('title', models.CharField(max_length=255)), ('tags', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=255), size=None)), ('cover', models.ImageField(upload_to=product.models.user_directory_path)), ('caption', models.TextField(blank=True, max_length=5000)), ('image', models.ImageField(upload_to=product.models.user_directory_path)), ('pdf', models.FileField(blank=True, upload_to=product.models.user_directory_path, validators=[django.core.validators.FileExtensionValidator(['pdf'])])), ('audio', models.FileField(blank=True, upload_to=product.models.user_directory_path, validators=[django.core.validators.FileExtensionValidator(['mp3'])])), ('video', models.FileField(blank=True, upload_to=product.models.user_directory_path, validators=[django.core.validators.FileExtensionValidator(['mp4'])])), ('rate', models.DecimalField(decimal_places=2, default=0, max_digits=20)), ('rate_p', models.DecimalField(decimal_places=2, default=0.99, max_digits=2)), ('create_date', models.DateTimeField()), ('edit_date', models.DateTimeField(auto_now=True)), ('page', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='posts', to='store.Store')), ('rated_by', models.ManyToManyField(blank=True, related_name='rated_posts', to=settings.AUTH_USER_MODEL)), ('sender', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='posts', to=settings.AUTH_USER_MODEL)), ('subcategories', models.ManyToManyField(related_name='posts', to='product.Subcategory')), ('viewed_by', models.ManyToManyField(blank=True, related_name='viewed_posts', to=settings.AUTH_USER_MODEL)), ], options={ 'ordering': ('-rate_p',), }, ), migrations.AddIndex( model_name='subcategory', index=models.Index(fields=['name', 'id'], name='product_sub_name_1de660_idx'), ), migrations.AddIndex( model_name='category', index=models.Index(fields=['name', 'id'], name='product_cat_name_88a6b7_idx'), ), ]
class Tag(models.Model): name = models.CharField(max_length=30) posts = models.ManyToManyField(Post, through=Post.tags.through, blank=True) def __unicode__(self): return self.name
class Library(models.Model): code = models.CharField(max_length=128, unique=True, validators=[validate_library_code]) genome = models.ForeignKey( Genome, on_delete=models.PROTECT, help_text="The genome against which the sequence" + " data from this library should be aligned.") sample = models.ForeignKey(Sample, on_delete=models.PROTECT) antibody = models.ForeignKey(Antibody, on_delete=models.PROTECT, null=True, blank=True) factor = models.ForeignKey(Factor, on_delete=models.PROTECT, null=True, blank=True) condition = models.ForeignKey(Condition, on_delete=models.PROTECT, null=True, blank=True) bad = models.BooleanField(default=False) release_worthy = models.BooleanField(default=False) projects = models.ManyToManyField(Project, db_table='library_project', related_name='libraries') libtype = models.ForeignKey(Libtype, on_delete=models.PROTECT) barcode = models.CharField(max_length=32, null=True, blank=True) linkerset = models.ForeignKey(Linkerset, on_delete=models.PROTECT, null=True, blank=True) chipsample = models.CharField(max_length=255, null=True, blank=True) paired = models.BooleanField(default=False) adapter = models.ForeignKey(Adapter, on_delete=models.PROTECT, null=True, blank=True, related_name='libraries') adapter2 = models.ForeignKey(Adapter, on_delete=models.PROTECT, null=True, blank=True, related_name='libraries2') platecode = models.CharField(max_length=32, null=True, blank=True) platecol = models.IntegerField(null=True, blank=True) platerow = models.CharField(max_length=1, choices=[('A', 'A'), ('B', 'B'), ('C', 'C'), ('D', 'D'), ('E', 'E'), ('F', 'F'), ('G', 'G'), ('H', 'H')], null=True, blank=True) comment = models.TextField(null=True, blank=True) external_records = models.ManyToManyField( ExternalRecord, db_table='library_external_record', related_name='libraries') objects = LibraryManager() @property def filename_tag(self): """ On-the-fly replacement for the old library description field, with the library code included for completeness. """ fac = self.factor.name if self.factor else 'unk' ant = self.antibody.name if self.antibody else 'unk' ind = self.sample.name if self.sample.name != self.code else '' sta = self.sample.source.strain.name if self.sample.source.strain else '' tis = self.sample.tissue.name if self.condition is not None: tis = "%s_%s" % (tis, self.condition) gen = self.genome.code # Here we pull out unnecessary duplication of the tissue name # which may have been introduced when generating a new sample name # (see osqpipe.pipeline.library). ind = string.replace(ind, tis, '') # Try to strip out not just trailing space, but some other characters we might use at a later date. ind = re.sub('[- _/;:.,]$', '', ind) return ("%s_%s_%s_%s_%s%s%s" % (self.code, fac, tis, ant, gen, sta, ind)) def __unicode__(self): return self.code class Meta: db_table = u'library' verbose_name_plural = 'libraries' ordering = ['code']
class BaseTemplate(models.Model): """ @summary: base abstract template,without containing business info """ category = models.CharField(_(u"模板类型"), choices=TASK_CATEGORY, max_length=255, default='Other') pipeline_template = models.ForeignKey(PipelineTemplate, blank=True, null=True, on_delete=models.SET_NULL, to_field='template_id') collector = models.ManyToManyField(settings.AUTH_USER_MODEL, verbose_name=_(u"收藏模板的人"), blank=True) notify_type = models.CharField(_(u"流程事件通知方式"), max_length=128, default='[]') # 形如 json.dumps({'receiver_group': ['Maintainers'], 'more_receiver': 'username1,username2'}) notify_receivers = models.TextField(_(u"流程事件通知人"), default='{}') time_out = models.IntegerField(_(u"流程超时时间(分钟)"), default=20) is_deleted = models.BooleanField(_(u"是否删除"), default=False) class Meta: # abstract would not be inherited automatically abstract = True ordering = ['-id'] @property def category_name(self): return self.get_category_display() @property def creator_name(self): return convert_readable_username(self.pipeline_template.creator) @property def editor_name(self): if self.pipeline_template and self.pipeline_template.editor: return convert_readable_username(self.pipeline_template.editor) else: return '' @property def name(self): return self.pipeline_template.name if self.pipeline_template else '' @property def create_time(self): return self.pipeline_template.create_time @property def edit_time(self): return self.pipeline_template.edit_time or self.create_time @property def pipeline_tree(self): tree = self.pipeline_template.data replace_template_id(self.__class__, tree, reverse=True) return tree @property def template_id(self): return self.id @property def subprocess_info(self): info = self.pipeline_template.subprocess_version_info pipeline_temp_ids = [ item['descendant_template_id'] for item in info['details'] ] qs = self.__class__.objects.filter( pipeline_template_id__in=pipeline_temp_ids).values( 'pipeline_template_id', 'id') pid_to_tid = {item['pipeline_template_id']: item['id'] for item in qs} for subprocess_info in info['details']: subprocess_info['template_id'] = pid_to_tid[subprocess_info.pop( 'descendant_template_id')] return info @property def version(self): return self.pipeline_template.version @property def subprocess_has_update(self): return self.pipeline_template.subprocess_has_update @property def template_wrapper(self): return PipelineTemplateWebWrapper(self.pipeline_template) @property def has_subprocess(self): return self.pipeline_template.has_subprocess def set_deleted(self): self.is_deleted = True PipelineTemplate.objects.delete_model(self.pipeline_template_id) self.save() def referencer(self): pipeline_template_referencer = self.pipeline_template.referencer() if not pipeline_template_referencer: return [] result = self.__class__.objects.filter( pipeline_template_id__in=pipeline_template_referencer, is_deleted=False).values('id', 'pipeline_template__name') for item in result: item['name'] = item.pop('pipeline_template__name') return result def update_pipeline_template(self, **kwargs): pipeline_template = self.pipeline_template if pipeline_template is None: return pipeline_tree = kwargs.pop('pipeline_tree') replace_template_id(self.__class__, pipeline_tree) pipeline_template.update_template(pipeline_tree, **kwargs) def get_clone_pipeline_tree(self): clone_tree = self.pipeline_template.clone_data() replace_template_id(self.__class__, clone_tree, reverse=True) return clone_tree def get_form(self, version=None): return self.template_wrapper.get_form(version) def get_outputs(self, version=None): return self.template_wrapper.get_outputs(version) def user_collect(self, username, method): user_model = get_user_model() user = user_model.objects.get(username=username) if method == 'add': self.collector.add(user) else: self.collector.remove(user) self.save() return {'result': True, 'data': ''} def get_pipeline_tree_by_version(self, version=None): tree = self.pipeline_template.data_for_version(version) replace_template_id(self.__class__, tree, reverse=True) return tree
class Migration(migrations.Migration): initial = True dependencies = [] operations = [ migrations.CreateModel( name='BrainRegion', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=255, unique=True)), ('abbreviation', models.CharField(max_length=255, unique=True)), ('is_super_group', models.BooleanField(default=False, verbose_name='self')), ('sub_groups', models.ManyToManyField( blank=True, related_name='_brainregion_sub_groups_+', to='inia.BrainRegion')), ], ), migrations.CreateModel( name='Dataset', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('legacy_id', models.IntegerField()), ('name', models.CharField(max_length=255, unique=True)), ('treatment', models.CharField(choices=[('DID', 'DID'), ('NONE', 'NONE'), ('CIA', 'CIA'), ('EOD', 'EOD'), ('LPS', 'LPS')], max_length=255)), ('microarray', models.CharField(max_length=255)), ('model', models.CharField(max_length=255)), ('phenotype', models.CharField(max_length=255)), ('species', models.CharField(choices=[('H**O SAPIENS', 'H**O SAPIENS'), ('MUS MUSCULUS', 'MUS MUSCULUS'), ('RATTUS NORVEGICUS', 'RATTUS NORVEGICUS')], max_length=255)), ('paradigm', models.CharField(max_length=255)), ('paradigm_duration', models.CharField(max_length=255)), ('alcohol', models.BooleanField()), ('brain_region', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='inia.BrainRegion')), ], ), migrations.CreateModel( name='GeneAliases', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('symbol', models.CharField(max_length=255)), ], ), migrations.CreateModel( name='Homologene', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('homologene_group_id', models.IntegerField(db_index=True)), ('gene_symbol', models.CharField(max_length=255)), ('created_at', models.DateField(auto_now=True)), ('updated_at', models.DateField(auto_now=True)), ('species', models.CharField(choices=[('H**O SAPIENS', 'H**O SAPIENS'), ('MUS MUSCULUS', 'MUS MUSCULUS'), ('RATTUS NORVEGICUS', 'RATTUS NORVEGICUS')], max_length=255)), ('brain', models.BooleanField()), ], ), migrations.CreateModel( name='IniaGene', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('legacy_id', models.IntegerField(db_index=True)), ('uniqueID', models.CharField(max_length=255)), ('gene_symbol', models.CharField(blank=True, max_length=255)), ('gene_name', models.CharField(max_length=255)), ('p_value', models.FloatField(blank=True, null=True)), ('fdr', models.FloatField()), ('direction', models.CharField(choices=[('UP', 'UP'), ('DOWN', 'DOWN')], max_length=255)), ('updated', models.DateTimeField(auto_now=True)), ('dataset', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='inia.Dataset')), ('homologenes', models.ManyToManyField(to='inia.Homologene')), ], ), migrations.CreateModel( name='Publication', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('legacy_id', models.IntegerField()), ('authors', models.TextField()), ('title', models.CharField(max_length=255)), ('journal', models.CharField(max_length=255)), ('pages', models.CharField(max_length=15)), ('date_sub', models.DateTimeField()), ('doi', models.CharField(max_length=255)), ('url', models.CharField(max_length=255)), ('display', models.CharField(max_length=255)), ('htmlid', models.CharField(max_length=255)), ], ), migrations.AddField( model_name='iniagene', name='publication', field=models.ForeignKey( on_delete=django.db.models.deletion.PROTECT, to='inia.Publication'), ), migrations.AddField( model_name='genealiases', name='IniaGene', field=models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, to='inia.IniaGene'), ), migrations.AddField( model_name='dataset', name='publication', field=models.ForeignKey( on_delete=django.db.models.deletion.PROTECT, to='inia.Publication'), ), ]
class SmartLink(models.Model): """ This model stores the basic fields for a smart link. Smart links allow linking documents using a programmatic method of conditions that mirror Django's database filter operations. """ label = models.CharField( db_index=True, help_text=_('A short text describing the smart link.'), max_length=128, verbose_name=_('Label')) dynamic_label = models.CharField( blank=True, max_length=96, help_text=_('Use this field to show a unique label depending on the ' 'document from which the smart link is being accessed.'), verbose_name=_('Dynamic label')) enabled = models.BooleanField(default=True, verbose_name=_('Enabled')) document_types = models.ManyToManyField(related_name='smart_links', to=DocumentType, verbose_name=_('Document types')) objects = SmartLinkManager() class Meta: ordering = ('label', ) verbose_name = _('Smart link') verbose_name_plural = _('Smart links') def __str__(self): return self.label def document_types_add(self, queryset, _user=None): with transaction.atomic(): event_smart_link_edited.commit(actor=_user, target=self) for obj in queryset: self.document_types.add(obj) event_document_type_edited.commit(actor=_user, action_object=self, target=obj) def document_types_remove(self, queryset, _user=None): with transaction.atomic(): event_smart_link_edited.commit(actor=_user, target=self) for obj in queryset: self.document_types.remove(obj) event_document_type_edited.commit(actor=_user, action_object=self, target=obj) def get_dynamic_label(self, document): """ If the smart links was created using a template label instead of a static label, resolve the template and return the result. """ if self.dynamic_label: try: template = Template(template_string=self.dynamic_label) return template.render(context={'document': document}) except Exception as exception: return _('Error generating dynamic label; %s' % force_text(exception)) else: return None def get_linked_document_for(self, document): """ Execute the corresponding smart links conditions for the document provided and return the resulting document queryset. """ if document.document_type.pk not in self.document_types.values_list( 'pk', flat=True): raise Exception( _('This smart link is not allowed for the selected ' 'document\'s type.')) smart_link_query = Q() for condition in self.conditions.filter(enabled=True): template = Template(template_string=condition.expression) condition_query = Q( **{ '%s__%s' % (condition.foreign_document_data, condition.operator): template.render(context={'document': document}) }) if condition.negated: condition_query = ~condition_query if condition.inclusion == INCLUSION_AND: smart_link_query &= condition_query elif condition.inclusion == INCLUSION_OR: smart_link_query |= condition_query if smart_link_query: return Document.objects.filter(smart_link_query) else: return Document.objects.none() def resolve_for(self, document): return ResolvedSmartLink( smart_link=self, queryset=self.get_linked_document_for(document=document)) def save(self, *args, **kwargs): _user = kwargs.pop('_user', None) with transaction.atomic(): is_new = not self.pk super(SmartLink, self).save(*args, **kwargs) if is_new: event_smart_link_created.commit(actor=_user, target=self) else: event_smart_link_edited.commit(actor=_user, target=self)
class Migration(migrations.Migration): dependencies = [ ('refugeedata', '0003_auto_20150513_1147'), ] operations = [ migrations.CreateModel( name='Distribution', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('date', models.DateField(verbose_name='Distribution Date')), ('supplies_quantity', models.SmallIntegerField(verbose_name='Supplies Quantity')), ('supplies_description', models.TextField(null=True, verbose_name='Supplies Description', blank=True)), ('finish_number', models.PositiveSmallIntegerField(null=True, blank=True)), ('attendees', models.ManyToManyField(related_name='distributions_attended', to='refugeedata.RegistrationNumber', blank=True)), ('invitees', models.ManyToManyField( related_name='distributions_invited_to', to='refugeedata.RegistrationNumber')), ], options={ 'ordering': ('date', ), 'verbose_name': 'Distribution', 'verbose_name_plural': 'Distributions', }, ), migrations.CreateModel( name='Template', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('type', models.CharField(max_length=1, verbose_name='Template Type', choices=[(b'P', 'SMS'), (b'E', 'Email')])), ('text', models.TextField(verbose_name='Template Text')), ('language', models.ForeignKey(verbose_name='Language', to='refugeedata.Language')), ], options={ 'verbose_name': 'Template', 'verbose_name_plural': 'Templates', }, ), migrations.AlterModelOptions( name='person', options={ 'ordering': ('registration_card__number', ), 'verbose_name': 'Person', 'verbose_name_plural': 'People' }, ), migrations.AlterField( model_name='person', name='photo', field=models.ImageField(upload_to=b'user_images', null=True, verbose_name='Photo', blank=True), ), migrations.AlterField( model_name='person', name='preferred_contact', field=models.CharField(default=b'E', max_length=1, verbose_name='Preferred Contact', choices=[(b'P', 'SMS'), (b'E', 'Email')]), ), migrations.AlterField( model_name='registrationcardbatch', name='data_file', field=models.FileField(upload_to=b'card_data', null=True, verbose_name='Data File', blank=True), ), migrations.AddField( model_name='distribution', name='templates', field=models.ManyToManyField(to='refugeedata.Template', verbose_name='Templates'), ), ]
class Migration(migrations.Migration): initial = True dependencies = [ ] operations = [ migrations.CreateModel( name='Article', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('title', models.CharField(max_length=255, verbose_name='Title')), ('link', models.URLField(verbose_name='Link')), ('content', models.TextField(verbose_name='Content')), ('publishedAt', models.DateTimeField(verbose_name='Published Time')), ('updatedAt', models.DateTimeField(auto_now=True, verbose_name='Updated Time')), ('show', models.BooleanField(default=True, help_text='Whether to show', verbose_name='Show')), ], options={ 'ordering': ('-updatedAt', '-publishedAt'), 'verbose_name_plural': 'Articles', 'verbose_name': 'Article', }, ), migrations.CreateModel( name='Author', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=25, verbose_name='Name')), ('link', models.URLField(blank=True, null=True, verbose_name='Homepage')), ], options={ 'verbose_name_plural': 'Authors', 'verbose_name': 'Author', }, ), migrations.CreateModel( name='Category', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('tag', models.CharField(max_length=25, unique=True, verbose_name='Tag')), ], options={ 'verbose_name_plural': 'Categories', 'verbose_name': 'Category', }, ), migrations.CreateModel( name='FeedChannel', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('title', models.CharField(max_length=50, verbose_name='Title')), ('link', models.URLField(verbose_name='Feed Link')), ('website', models.URLField(verbose_name='Official Website')), ('subtitle', models.TextField(blank=True, null=True, verbose_name='Subtitle')), ('description', models.TextField(blank=True, null=True, verbose_name='Description')), ], options={ 'ordering': ('title',), 'verbose_name_plural': 'Feed Channels', 'verbose_name': 'Feed Channel', }, ), migrations.AlterUniqueTogether( name='feedchannel', unique_together=set([('title', 'link')]), ), migrations.AlterUniqueTogether( name='author', unique_together=set([('name', 'link')]), ), migrations.AddField( model_name='article', name='authors', field=models.ManyToManyField(to='rss.Author', verbose_name='Authors'), ), migrations.AddField( model_name='article', name='categories', field=models.ManyToManyField(to='rss.Category', verbose_name='Categories'), ), migrations.AddField( model_name='article', name='channel', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rss.FeedChannel', verbose_name='FeedChannel'), ), migrations.AlterUniqueTogether( name='article', unique_together=set([('channel', 'title', 'link')]), ), ]
class B(models.Model): b_text = models.CharField(max_length=20) a_list = models.ManyToManyField(A, through=Through)
class Computer(MgmtBaseModel): """ A computer or other networked device. """ common_name = models.CharField(max_length=64) hardware = models.CharField(max_length=256) host_id = models.SlugField(max_length=256, blank=True) person = models.ForeignKey( "people.Person", on_delete=models.SET_NULL, blank=True, null=True, limit_choices_to={"active": True, "flags__slug": "asset-owner"}, help_text='Only people with the "asset-owner" flag are shown', ) room = models.ForeignKey( "places.Room", on_delete=models.SET_NULL, blank=True, null=True, limit_choices_to={"active": True}, ) operating_system = models.CharField(max_length=64, null=True, blank=True) asset = models.ForeignKey( Asset, on_delete=models.SET_NULL, blank=True, null=True, limit_choices_to={"active": True}, ) processor = models.CharField(max_length=64, null=True, blank=True) ram = models.CharField(max_length=32, null=True, blank=True) harddrive = models.CharField(max_length=32, null=True, blank=True) manufacturing_year = models.PositiveSmallIntegerField(null=True, blank=True) admin_user = models.CharField(max_length=32, null=True, blank=True) admin_password = models.CharField(max_length=32, null=True, blank=True) ssh_port = models.PositiveSmallIntegerField( default=22, null=True, blank=True, verbose_name="SSH Port" ) flags = models.ManyToManyField( ComputerFlag, blank=True, limit_choices_to={"active": True} ) notes = models.TextField(null=True, blank=True) objects = ComputerManager() class Meta: base_manager_name = "objects" def __str__(self): return self.common_name @property def alive(self): if self.ip_address is not None: return self.ip_address.alive def has_flag(self, flag_slug): """ Returns True if the object has a flag with the given slug """ return self.flags.active().has_slug(flag_slug) def get_primary_net_iface(self): """ Return the primary network interface object, if any. Return None if none can be found. """ return self.networkinterface_set.active().primary().get()
class MyModel(PostgreSQLModel): field = ArrayField( models.ManyToManyField('postgres_tests.IntegerArrayModel'))
class User(AbstractUser): followers = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name="followings")
class DataRecord(models.Model): UPLOAD = 'upload' DHIS = 'dhis' AGGREGATION = 'aggregation' SOURCES = { UPLOAD: _("Direct"), DHIS: _("DHIS"), AGGREGATION: _("Aggregation"), } NOT_VALIDATED = 'not_validated' VALIDATED = 'validated' AUTO_VALIDATED = 'auto_validated' REJECTED = 'rejected' MODIFIED = 'modified' VALIDATION_STATUSES = { NOT_VALIDATED: _("Not Validated"), VALIDATED: _("Validated"), AUTO_VALIDATED: _("Auto Validated"), REJECTED: _("Rejected"), MODIFIED: _("Modified"), } ARRIVED = 'arrived' ARRIVED_ON_TIME = 'on_time' ARRIVED_LATE = 'late' ARRIVAL_STATUSES = { ARRIVED: _("Arrived"), ARRIVED_ON_TIME: _("Arrived On Time"), ARRIVED_LATE: _("Arrived Late"), } VALIDATED_STATUSES = [VALIDATED, AUTO_VALIDATED, MODIFIED] class Meta: app_label = 'dmd' unique_together = (('indicator', 'period', 'entity'),) indicator = models.ForeignKey('Indicator', related_name='data_records') period = models.ForeignKey('MonthPeriod', related_name='data_records') entity = models.ForeignKey('Entity', related_name='data_records') numerator = models.FloatField() denominator = models.FloatField() source = models.CharField(max_length=128, choices=SOURCES.items()) created_on = models.DateTimeField(auto_now_add=True) created_by = models.ForeignKey('Partner', related_name='records_created') updated_on = models.DateTimeField(auto_now=True, null=True, blank=True) updated_by = models.ForeignKey('Partner', null=True, blank=True, related_name='records_updated') arrival_status = models.CharField( max_length=128, choices=ARRIVAL_STATUSES.items(), default=ARRIVED) validation_status = models.CharField( max_length=128, choices=VALIDATION_STATUSES.items(), default=NOT_VALIDATED) validated_on = models.DateTimeField(null=True, blank=True) validated_by = models.ForeignKey('Partner', null=True, blank=True, related_name='records_validated') sources = models.ManyToManyField('self', blank=True) objects = DRStatusQuerySet.as_manager() statuses = DRStatusQuerySet.as_manager() django = models.Manager() def __str__(self): return self.__unicode__().encode('utf-8') def __unicode__(self): return "{i}@{p}".format(i=self.indicator, p=self.period) @property def source_verbose(self): return self.SOURCES.get(self.source) @property def arrival_status_verbose(self): return self.ARRIVAL_STATUSES.get(self.arrival_status) @property def validation_status_verbose(self): return self.VALIDATION_STATUSES.get(self.validation_status) @property def validated(self): return self.validation_status in self.VALIDATED_STATUSES @property def auto_validated(self): return self.validated_by == Partner.validation_bot() @property def aggregate(self): return self.source == self.AGGREGATION @property def value(self): return self.indicator.compute_value(self.numerator, self.denominator) @property def formatted(self): return self.indicator.format_number(self.value) @property def formatted_numerator(self): return self.indicator.format_number(self.numerator) @property def formatted_denominator(self): return self.indicator.format_number(self.denominator) @property def data_is_suspect(self): if self.denominator: return self.denominator < self.numerator return False @classmethod def get_or_none(cls, indicator, period, entity, only_validated=False): qs = cls.objects.filter(indicator=indicator, period=period, entity=entity) if only_validated: qs = qs.filter(validation_status__in=cls.VALIDATED_STATUSES) try: return qs.get() except cls.DoesNotExist: return None @classmethod def get_by_id(cls, drid): try: return cls.objects.get(id=drid) except cls.DoesNotExist: return None @classmethod def batch_create(cls, data, partner, source=UPLOAD, arrival_status=None, auto_validate=False): now = timezone.now() # make sure we can rollback if something goes wrong with transaction.atomic(): for ident, dp in data.items(): # skip errors if ident == 'errors': continue slug = dp['slug'] period = dp['period'] entity = dp['entity'] indic = Indicator.get_or_none(slug) dr = cls.get_or_none(indicator=indic, period=period, entity=entity) num = dp['numerator'] denum = dp['denominator'] if dr and (dr.numerator != num or dr.denominator != denum): # do not manualy update DHIS data if dr.source == dr.DHIS and source == dr.UPLOAD: continue old_values = {'numerator': dr.numerator, 'denominator': dr.denominator} action = 'updated' dr.numerator = num dr.denominator = denum dr.record_update(partner) elif dr and dr.source == dr.UPLOAD and source == dr.DHIS: # mark data as updated by DHIS even though it's identical dr.record_update(partner) elif dr is None: old_values = None action = 'created' if arrival_status is None: arrival_status = indic.arrival_status_on( on=now, period=period) dr = cls.objects.create( indicator=indic, period=period, entity=entity, numerator=num, denominator=denum, source=source, created_by=partner) if auto_validate: dr.auto_validate(on=now) else: # new data are identical to datarecord continue data[ident].update({ 'action': action, 'id': dr.id, 'previous': old_values}) return data @classmethod def get_for(cls, period, entity, indicator): return { dr.entity.uuids: dr.to_dict() for dr in cls.objects .filter(indicator=indicator, period=period, entity__in=entity.get_children()) .filter(validation_status__in=cls.VALIDATED_STATUSES) if dr is not None} @classmethod def get_for_periods(cls, periods, entity, indicator): return { child.uuids: indicator.data_for(entity=child, periods=periods) for child in entity.get_children() } def record_validation(self, status, on, by): self.validation_status = status self.validated_on = on self.validated_by = by self.save() def remove_validation(self): self.record_validation(status=self.NOT_VALIDATED, on=None, by=None) def validate(self, on, by): self.record_validation(status=self.VALIDATED, on=on, by=by) def reject(self, on, by): self.record_validation(status=self.REJECTED, on=on, by=by) def auto_validate(self, on): self.record_validation(status=self.AUTO_VALIDATED, on=on, by=Partner.validation_bot()) def record_update(self, partner, keep_validation=False): self.updated_on = timezone.now() self.updated_by = partner if not keep_validation: self.remove_validation() self.save() def edit(self, on, by, numerator, denominator): with transaction.atomic(): self.numerator = numerator self.denominator = denominator self.record_update(by) self.record_validation(status=self.MODIFIED, on=on, by=by) def human(self): return self.indicator.format_value(value=self.value, numerator=self.numerator, denominator=self.denominator) def to_dict(self): return { 'kind': 'data-record', 'indicator': self.indicator.slug, 'period': self.period.strid, 'periods': None, 'entity': self.entity.uuids, 'numerator': self.numerator, 'denominator': self.denominator, 'value': self.value, 'formatted': self.formatted, 'human': self.human(), } @property def validation_deadline(self): return self.indicator.validation_deadline(self.period, self.created_on) def validation_period_is_over(self, on=None): if on is None: on = timezone.now() val_dl = self.validation_deadline return on > val_dl if val_dl is not None else False
class Migration(migrations.Migration): dependencies = [ ('rooms', '0002_auto_20200215_2346'), ] operations = [ migrations.CreateModel( name='Amenity', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('created', models.DateTimeField(auto_now_add=True)), ('updated', models.DateTimeField(auto_now=True)), ('name', models.CharField(max_length=80)), ], options={ 'abstract': False, }, ), migrations.CreateModel( name='Facility', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('created', models.DateTimeField(auto_now_add=True)), ('updated', models.DateTimeField(auto_now=True)), ('name', models.CharField(max_length=80)), ], options={ 'abstract': False, }, ), migrations.CreateModel( name='HouseRule', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('created', models.DateTimeField(auto_now_add=True)), ('updated', models.DateTimeField(auto_now=True)), ('name', models.CharField(max_length=80)), ], options={ 'abstract': False, }, ), migrations.RemoveField( model_name='room', name='room_type', ), migrations.AddField( model_name='room', name='room_type', field=models.ForeignKey( null=True, on_delete=django.db.models.deletion.SET_NULL, to='rooms.RoomType'), ), migrations.AddField( model_name='room', name='amenities', field=models.ManyToManyField(blank=True, related_name='rooms', to='rooms.Amenity'), ), migrations.AddField( model_name='room', name='facilities', field=models.ManyToManyField(blank=True, related_name='rooms', to='rooms.Facility'), ), migrations.AddField( model_name='room', name='house_rules', field=models.ManyToManyField(blank=True, related_name='rooms', to='rooms.HouseRule'), ), ]
class Migration(migrations.Migration): initial = True dependencies = [ ] operations = [ migrations.CreateModel( name='Athlete', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('last_name', models.CharField(max_length=64)), ('first_name', models.CharField(max_length=64)), ('date_of_birth', models.DateField()), ('sex', models.CharField(choices=[('m', 'Male'), ('f', 'Female')], default='m', help_text='Select sex', max_length=1)), ('headshot', models.ImageField(blank=True, default='planner/athlete_headshots/no-img.jpg', upload_to='planner/athlete_headshots')), ], options={ 'ordering': ['last_name', 'first_name', 'date_of_birth'], }, ), migrations.CreateModel( name='Equipment', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('equipment', models.CharField(choices=[('kb', 'Kettlebell'), ('db', 'Dumbbell'), ('bb', 'Barbell'), ('c2r', 'Rower'), ('aab', 'AAB'), ('c2s', 'Ski'), ('box', 'Box'), ('c2b', 'Airbike'), ('ghd', 'GHD'), ('sb', 'Sandbag'), ('jr', 'Jumprope')], help_text='Select equipment', max_length=3)), ], ), migrations.CreateModel( name='Exercise', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(help_text='Enter an exercise', max_length=64)), ('category', models.CharField(blank=True, choices=[('g', 'Gymnastics'), ('w', 'Weightlifting'), ('m', 'Monostructural')], help_text='Gymnastics, Weightlifting ...', max_length=1, null=True)), ('part', models.CharField(blank=True, choices=[('u', 'upper body'), ('l', 'lower body')], help_text='upper or lower body?', max_length=1, null=True)), ('equipment', models.ForeignKey(blank=True, help_text='Equipment used', null=True, on_delete=django.db.models.deletion.PROTECT, to='planner.Equipment')), ], ), migrations.CreateModel( name='MovementCategory', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(help_text='e.g. Squat or Pull Ups', max_length=64)), ], ), migrations.CreateModel( name='Track', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(help_text='Enter a track type', max_length=32)), ], ), migrations.CreateModel( name='Training', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(blank=True, max_length=64, null=True)), ('coaches_notes', models.TextField(blank=True, help_text='Enter coaches notes', max_length=1024, null=True)), ], ), migrations.CreateModel( name='TrainingPart', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=64, null=True)), ('benchmark', models.BooleanField(default=False, help_text='Will be stored for reuse', null=True)), ('scored_type', models.CharField(choices=[('emom', 'EMOM'), ('sets', 'SetsReps'), ('amrap', 'AMRAP'), ('coup', 'Couplet'), ('trip', 'Triplet'), ('chip', 'Chipper'), ('free', 'FreeTraining')], default='free', help_text='EMOM, AMRAP ...', max_length=5)), ], ), migrations.CreateModel( name='TrainingPartInstance', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('rx', models.BooleanField(default=False, help_text='True if RX', null=True)), ('date', models.DateTimeField(blank=True, default=django.utils.timezone.now)), ('athlete', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='planner.Athlete')), ('training', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='planner.TrainingPart')), ], ), migrations.CreateModel( name='Warmup', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(blank=True, max_length=64, null=True)), ('warmup', models.TextField(help_text='Warmup routine', max_length=1024)), ('additional', models.TextField(blank=True, default=False, help_text='Add stuff to preexisting routine', max_length=1024)), ('save', models.BooleanField(blank=True, default=False, help_text='Check for save')), ('equipment', models.ForeignKey(blank=True, help_text='Equipment used', null=True, on_delete=django.db.models.deletion.PROTECT, to='planner.Equipment')), ('track', models.ForeignKey(blank=True, help_text='Enter a track', null=True, on_delete=django.db.models.deletion.PROTECT, to='planner.Track')), ], options={ 'ordering': ['track', 'name'], }, ), migrations.CreateModel( name='Workout', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(blank=True, max_length=64, null=True)), ('date', models.DateField(blank=True, default=django.utils.timezone.now)), ('cooldown', models.TextField(blank=True, help_text='Enter finnisher or cooldown, if necessary', max_length=1024, null=True)), ('coaches_notes', models.TextField(blank=True, help_text='Enter coaches notes, if necessary', max_length=1024, null=True)), ('track', models.ForeignKey(default=0, help_text='Select a category (WOD, Hyrox ...)', on_delete=django.db.models.deletion.PROTECT, to='planner.Track')), ('training', models.ManyToManyField(help_text='Enter training parts', to='planner.Training')), ('warmup', models.ForeignKey(blank=True, help_text='Enter warmup, if necessary', null=True, on_delete=django.db.models.deletion.PROTECT, to='planner.Warmup')), ], options={ 'ordering': ['date', 'track'], }, ), migrations.CreateModel( name='AMRAPInstance', fields=[ ('trainingpartinstance_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='planner.TrainingPartInstance')), ('scored_rounds', models.PositiveIntegerField(blank=True, null=True)), ('scored_reps', models.PositiveIntegerField()), ], options={ 'ordering': ['scored_rounds', 'scored_reps', 'date'], }, bases=('planner.trainingpartinstance',), ), migrations.CreateModel( name='EMOMInstance', fields=[ ('trainingpartinstance_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='planner.TrainingPartInstance')), ('scored_reps', models.IntegerField(blank=True, null=True)), ], options={ 'ordering': ['scored_reps', 'date'], }, bases=('planner.trainingpartinstance',), ), migrations.CreateModel( name='ForTimeInstance', fields=[ ('trainingpartinstance_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='planner.TrainingPartInstance')), ('finnished', models.BooleanField(default=True, help_text='True if finished in time', null=True)), ('scored_time', models.DurationField(blank=True, null=True)), ('scored_reps', models.IntegerField(blank=True, null=True)), ], options={ 'ordering': ['scored_time', 'scored_reps', 'date'], }, bases=('planner.trainingpartinstance',), ), migrations.CreateModel( name='FreeTraining', fields=[ ('trainingpart_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='planner.TrainingPart')), ('description', models.TextField(help_text="This wont come op in analysation and can't be scored.", max_length=1024)), ], bases=('planner.trainingpart',), ), migrations.CreateModel( name='FreeTrainingInstance', fields=[ ('trainingpartinstance_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='planner.TrainingPartInstance')), ], options={ 'ordering': ['date'], }, bases=('planner.trainingpartinstance',), ), migrations.CreateModel( name='SetsRepsInstance', fields=[ ('trainingpartinstance_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='planner.TrainingPartInstance')), ('finnished', models.BooleanField(default=True, help_text='True if finished in time', null=True)), ('scored_weight', models.FloatField(help_text='Weight in kg')), ('scored_sets', models.PositiveIntegerField(default=planner.models.SetsRepsInstance.get_default_sets)), ('scored_reps', models.PositiveIntegerField(default=planner.models.SetsRepsInstance.get_default_reps)), ], options={ 'ordering': ['scored_weight', 'scored_reps', 'scored_sets', 'date'], }, bases=('planner.trainingpartinstance',), ), migrations.CreateModel( name='WorkoutInstance', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('date', models.DateField(blank=True, default=django.utils.timezone.now)), ('notes', models.TextField(blank=True, max_length=1024)), ('strain', models.PositiveIntegerField(blank=True, help_text='How hard was it (1-10)?', null=True)), ('athlete', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='planner.Athlete')), ('workout', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='planner.Workout')), ], ), migrations.AddField( model_name='training', name='training', field=models.ForeignKey(blank=True, help_text='Enter training', null=True, on_delete=django.db.models.deletion.PROTECT, to='planner.TrainingPart'), ), migrations.AddField( model_name='training', name='warmup', field=models.ForeignKey(blank=True, help_text='Enter warmup, if planned', null=True, on_delete=django.db.models.deletion.PROTECT, to='planner.Warmup'), ), migrations.CreateModel( name='ExerciseSceme', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('reps', models.IntegerField(blank=True, help_text='Select number of reps', null=True)), ('weight_male', models.FloatField(blank=True, help_text='Select weight in kg', null=True)), ('weight_female', models.FloatField(blank=True, help_text='Select weight in kg', null=True)), ('watt_male', models.IntegerField(blank=True, help_text='Select watt', null=True)), ('watt_female', models.IntegerField(blank=True, help_text='Select watt', null=True)), ('cals_male', models.IntegerField(blank=True, help_text='Select cals', null=True)), ('cals_female', models.IntegerField(blank=True, help_text='Select cals', null=True)), ('distance_male', models.IntegerField(blank=True, help_text='Select meters', null=True)), ('distance_female', models.IntegerField(blank=True, help_text='Select meters', null=True)), ('time', models.DurationField(blank=True, null=True)), ('percentage', models.PositiveIntegerField(blank=True, help_text='Select percentage of max effort or max weight', null=True)), ('tempo', models.CharField(blank=True, help_text='Four letters ebct e.g 41x0', max_length=4, null=True)), ('plus_x', models.IntegerField(blank=True, default=0, help_text='+X in each round')), ('exercise', models.ForeignKey(help_text='Select an exercise (Snatch, HSPU ...)', on_delete=django.db.models.deletion.PROTECT, to='planner.Exercise')), ], options={ 'ordering': ['exercise', 'reps', 'weight_male', 'cals_male', 'distance_male', 'watt_male', 'time', 'percentage', 'tempo'], }, ), migrations.AddField( model_name='exercise', name='movement_category', field=models.ManyToManyField(to='planner.MovementCategory'), ), migrations.CreateModel( name='Block', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('rounds', models.PositiveIntegerField(blank=True, default=1)), ('exercises', models.ManyToManyField(to='planner.ExerciseSceme')), ], ), migrations.CreateModel( name='SetsReps', fields=[ ('trainingpart_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='planner.TrainingPart')), ('sets', models.IntegerField(blank=True, default=1, help_text='Select number of sets')), ('rest', models.DurationField(blank=True, help_text=' - rest ... between sets', null=True)), ('exercise', models.ForeignKey(help_text='Select an exercise (Snatch, HSPU ...)', on_delete=django.db.models.deletion.PROTECT, to='planner.Exercise')), ], bases=('planner.trainingpart',), ), migrations.CreateModel( name='ForTime', fields=[ ('trainingpart_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='planner.TrainingPart')), ('time_cap', models.DurationField(blank=True, null=True)), ('buyin', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='fortime_buyin', to='planner.Block')), ('exercises', models.ManyToManyField(to='planner.Block')), ], bases=('planner.trainingpart',), ), migrations.CreateModel( name='EMOM', fields=[ ('trainingpart_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='planner.TrainingPart')), ('seconds', models.IntegerField(blank=True, help_text='e...sos', null=True)), ('minutes', models.IntegerField(blank=True, help_text='e...mom', null=True)), ('duration', models.IntegerField(blank=True, help_text='Select duration in minutes', null=True)), ('exercises', models.ManyToManyField(to='planner.Block')), ], bases=('planner.trainingpart',), ), migrations.CreateModel( name='AMRAP', fields=[ ('trainingpart_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='planner.TrainingPart')), ('time', models.DurationField(blank=True, help_text='Workout time', null=True)), ('buyin', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='amrap_buyin', to='planner.Block')), ('exercises', models.ManyToManyField(to='planner.Block')), ], bases=('planner.trainingpart',), ), ]
class Ruleset(models.Model): name = models.CharField(max_length=100, unique=True) descr = models.CharField(max_length=400, blank=True) created_date = models.DateTimeField('date created') updated_date = models.DateTimeField('date updated', blank=True) need_test = models.BooleanField(default=True) validity = models.BooleanField(default=True) errors = models.TextField(blank=True) rules_count = models.IntegerField(default=0) editable = True # List of Source that can be used in the ruleset # It can be a specific version or HEAD if we want to use # latest available sources = models.ManyToManyField(SourceAtVersion) # List of Category selected in the ruleset categories = models.ManyToManyField(Category, blank=True) # List or Rules to suppressed from the Ruleset # Exported as suppression list in oinkmaster suppressed_rules = models.ManyToManyField(Rule, blank=True) # Operations # Creation: # - define sources # - define version # - define categories # - define suppressed rules # Delete # Copy # - Specify new name # Refresh: # - trigger update of sources # - build new head # Update: # - define version # - update link # Generate appliance ruleset to directory: # - get files from correct version exported to directory # Apply ruleset: # - Tell Ansible to publish def __unicode__(self): return self.name def _json_errors(self): return json.loads(self.errors) json_errors = property(_json_errors) def get_absolute_url(self): from django.core.urlresolvers import reverse return reverse('ruleset', args=[str(self.id)]) def update(self): sourcesatversion = self.sources.all() for sourcesat in sourcesatversion: sourcesat.source.update() self.updated_date = timezone.now() self.need_test = True self.save() def generate(self): rules = Rule.objects.filter(category__in=self.categories.all(), state=True) # remove suppressed list rules = list(set(rules.all()) - set(self.suppressed_rules.all())) return rules def generate_threshold(self, directory): thresholdfile = os.path.join(directory, 'threshold.config') with open(thresholdfile, 'w') as f: for threshold in Threshold.objects.filter(ruleset=self): f.write("%s\n" % (threshold)) def copy(self, name): orig_sources = self.sources.all() orig_categories = self.categories.all() orig_supp_rules = self.suppressed_rules.all() self.name = name self.pk = None self.id = None self.save() self.sources = orig_sources self.categories = orig_categories self.suppressed_rules = orig_supp_rules self.save() return self def export_files(self, directory): for src in self.sources.all(): src.export_files(directory) # generate threshold.config self.generate_threshold(directory) def diff(self, mode='long'): sourcesatversion = self.sources.all() sdiff = {} for sourceat in sourcesatversion: supdate = SourceUpdate.objects.filter( source=sourceat.source).order_by('-created_date') if len(supdate) > 0: srcdiff = supdate[0].diff() if mode == 'short': num = 0 for key in srcdiff['stats']: num = num + srcdiff['stats'][key] if num > 0: sdiff[sourceat.name] = srcdiff else: sdiff[sourceat.name] = srcdiff return sdiff def to_buffer(self): rules = self.generate() self.rules_count = len(rules) file_content = "# Rules file for " + self.name + " generated by Scirius at " + str( timezone.now()) + "\n" rules_content = [rule.content for rule in rules] file_content += "\n".join(rules_content) return file_content def test_rule_buffer(self, rule_buffer, single=False): Probe = __import__(settings.RULESET_MIDDLEWARE) testor = Probe.common.Test() tmpdir = tempfile.mkdtemp() self.export_files(tmpdir) related_files = {} for root, _, files in os.walk(tmpdir): for f in files: fullpath = os.path.join(root, f) with open(fullpath, 'r') as cf: related_files[f] = cf.read(50 * 1024) shutil.rmtree(tmpdir) if single: return testor.rule(rule_buffer, related_files=related_files) else: return testor.rules(rule_buffer, related_files=related_files) def test(self): self.need_test = False rule_buffer = self.to_buffer() result = self.test_rule_buffer(rule_buffer) result['rules_count'] = self.rules_count self.validity = result['status'] if result.has_key('errors'): self.errors = json.dumps(result['errors']) else: self.errors = json.dumps([]) self.save() return result def disable_rules(self, rules): self.suppressed_rules.add(*rules) self.needs_test() def enable_rules(self, rules): self.suppressed_rules.remove(*rules) self.needs_test() def needs_test(self): self.need_test = True self.save()