示例#1
0
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'),
        ),
    ]
示例#3
0
文件: models.py 项目: komadmin/site
class Genre(models.Model):
    def __str__(self):
        return "%s" % self.genre
    movie = models.ManyToManyField(Movie)
    genre = models.CharField('Genre', max_length=25, default='')
示例#4
0
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)),
            ],
        ),
    ]
示例#5
0
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
示例#6
0
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)
示例#8
0
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']
示例#9
0
class KeyFetchEvent(AuditEvent):

    keys_loaded = models.ManyToManyField(Key)

    def __str__(self):
        return "KeyFetchEvent { %s, %s, %s }" % (self.public_id, self.server, self.audit_type)
示例#10
0
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')]),
        ),
    ]
示例#11
0
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='用户'),
        ),
    ]
示例#12
0
class Student(models.Model, Person):
    grades = models.ManyToManyField(Grade)
    content = models.OneToOneField(ContentItemCollection)
示例#13
0
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()
示例#14
0
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        ',
        ),
    ]
示例#15
0
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'),
        ),
    ]
示例#16
0
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
示例#17
0
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']
示例#18
0
文件: models.py 项目: manlucas/atom
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
示例#19
0
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'),
        ),
    ]
示例#20
0
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)
示例#21
0
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'),
        ),
    ]
示例#22
0
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')]),
        ),
    ]
示例#23
0
class B(models.Model):
    b_text = models.CharField(max_length=20)
    a_list = models.ManyToManyField(A, through=Through)
示例#24
0
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()
示例#25
0
 class MyModel(PostgreSQLModel):
     field = ArrayField(
         models.ManyToManyField('postgres_tests.IntegerArrayModel'))
示例#26
0
class User(AbstractUser):
    followers = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name="followings")
示例#27
0
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'),
        ),
    ]
示例#29
0
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',),
        ),
    ]
示例#30
0
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()