class DerivativeGroup(BiologicalModel): name = dmodels.CharField(max_length=600, unique=True, di_show=True, di_display_name='derivative_group') def __str__(self): return self.name
class Pathway(MetaModel): name = dmodels.CharField(max_length=255, unique=True, di_show=True, di_display_name='pathway') reaction = dmodels.ManyToManyField('Reaction', related_name='reactions') def __str__(self): return self.name
class Locus(BiologicalModel): di_first = True locus_tag = dmodels.CharField(max_length=255, unique=True, di_show=True) product = dmodels.CharField(max_length=255, di_show=True, blank=True) ec_number = ArrayField(dmodels.CharField(max_length=15, blank=True, validators=[ec_validator]), blank=True, verbose_name='EC number') reaction = dmodels.ManyToManyField('Reaction', related_name='loci') class Meta: verbose_name_plural = "loci" def __str__(self): try: return '{} -- {}'.format(self.locus_tag, self.gene.product) except: return '{}'.format(self.locus_tag)
class CoADerivative(BiologicalModel): name = dmodels.CharField(max_length=600, unique=True, di_show=True, di_display_name='CoA_derivative') class Meta: verbose_name_plural = 'CoA derivatives' def __str__(self): return self.name
class Metabolite(BiologicalModel): name = dmodels.CharField(max_length=512, di_display_name='metabolite_name', di_show=True) derivative_group = dmodels.ForeignKey('DerivativeGroup', null=True, blank=True) co_a_derivative = dmodels.ForeignKey('CoADerivative', null=True, blank=True) def __str__(self): return self.name
class Reaction(BiologicalModel): name = dmodels.CharField(max_length=255, unique=True, di_show=True, di_display_name='reaction_name') reaction_equation = dmodels.TextField() lb = dmodels.FloatField(null=True, blank=True) ub = dmodels.FloatField(null=True, blank=True) brenda = dmodels.CharField(max_length=13, blank=True) kegg = dmodels.CharField(max_length=10, blank=True, di_show=True) metacyc = dmodels.CharField(max_length=100, blank=True) pubmed = dmodels.CharField(max_length=12, blank=True) notes = dmodels.TextField(blank=True) metabolite = dmodels.ManyToManyField( 'Metabolite', related_name='reactions') #, through='ReactionMetabolite') def __str__(self): """Return equation and database ID if exists in specified order.""" allowed_length = 30 if self.brenda: return self.brenda elif self.metacyc: return self.metacyc elif self.kegg: return self.kegg else: if len(self.reaction_equation) < allowed_length: return self.reaction_equation else: return self.reaction_equation[:30] + '[...]' @property def brendalink(self): if self.brenda: prefix = self.brenda[:2] refid = self.brenda[2:] link = '<a href="http://www.brenda-enzymes.org/structure.php?show=reaction&id={}&type={}&displayType=marvin">{}</a>' if prefix == 'BS': return format_html(link, mark_safe(refid), mark_safe('S'), self.brenda) elif prefix == 'BR': return format_html(link, mark_safe(refid), mark_safe('I'), self.brenda) else: return None @property def kegglink(self): if self.kegg: link = '<a href="http://www.genome.jp/dbget-bin/www_bget?rn:{}">{}</a>' return format_html(link, mark_safe(self.kegg), self.kegg) else: return None @property def metacyclink(self): if self.metacyc: link = '<a href="http://metacyc.org/META/NEW-IMAGE?type=NIL&object={}&redirect=T">{}</a>' return format_html(link, mark_safe(self.metacyc), self.metacyc) else: return None @property def db_crossref(self): return (self.brendalink or self.kegglink or self.metacyclink or 'No cross reference found.') @property def short_reaction(self): allowed_length = 30 if len(self.reaction_id < allowed_length): return self.reaction_id else: return self.reaction_id[:30] + '[...]'
class Experiment(models.Model, DisbiExperiment): EXPERIMENT_TYPE_CHOICES = ( ('transcriptome', 'Transcriptome'), ('proteome', 'Proteome'), ('metabolome', 'Metabolome'), ('flux', 'Predicted Flux'), ) experiment_type = dmodels.CharField(max_length=45, choices=EXPERIMENT_TYPE_CHOICES, di_choose=True) # The first name is the DB name, the second is human readable. EXPERIMENT_METHOD_CHOICES = ( ('Transcriptome', (('rnaseq', 'RNAseq'), )), ('Proteome', (('shotgun', 'shotgun'), )), ('Metabolome', ( ('gcms', 'GCMS'), ('coa', 'CoA-method'), )), ('Predicted Flux', (('fba', 'FBA'), )), ) experiment_method = dmodels.CharField(max_length=45, choices=EXPERIMENT_METHOD_CHOICES, di_choose=True) c_source = dmodels.CharField(max_length=45, blank=True, verbose_name='Carbon source', di_choose=True, di_show=True, di_combinable=True) place = dmodels.CharField(max_length=45) group = dmodels.CharField(max_length=45) raw_data = dmodels.ForeignKey( 'RawData', help_text='A file with the raw data for the experiment') notes = dmodels.TextField(blank=True, default='') class Meta: unique_together = (('experiment_type', 'experiment_method', 'c_source', 'group', 'raw_data'), ) def __str__(self): return '{}. {}: {}'.format( self.id, self.get_experiment_type_display(), self.get_experiment_method_display(), ) def clean(self): """ Check whether the experiment method matches the experiment type. """ opt_groups = get_optgroups(self.EXPERIMENT_METHOD_CHOICES) hr_experiment_type = get_hr_val(self.EXPERIMENT_TYPE_CHOICES, self.experiment_type) if self.experiment_method not in opt_groups[hr_experiment_type]: hr_experiment_method = get_hr_val( remove_optgroups(self.EXPERIMENT_METHOD_CHOICES), self.experiment_method) raise ValidationError( _('{type} does not belong to the method {method}.'.format( type=hr_experiment_type, method=hr_experiment_method))) def c_source_display(self): return self.c_source if self.c_source else '-' c_source_display.short_description = 'Carbon source'