import logging import uuid from django.contrib.auth.models import AbstractUser from django.db import models logger = logging.getLogger(__name__) SITE_CHOICES = ( ("5HT2C", "5-HT2C"), ("5HT2A", "5-HT2A"), ("GABAB", "GABAB"), ("NMDA", "NMDA"), ) MECHANISM_CHOICES = ( ("AGONISM", "Agonism"), ("ANTAGONISM", "Antagomism"), ("MODULATION", "Modulation"), ) SOURCE_TYPE_CHOICES = ( ("PSITE", "Professional pharmaceutical data repository"), ("DWIKI", "Dedicated peer-reviewed community wiki"), ("CWIKI", "Peer-reviewed community wiki"), ("WIKI", "Private wiki"), ("DFORUM", "Dedicated community forum"), ("FORUM", "Community forum"), ) DOSAGE_UNIT_CHOICES = ( ("mg", "mg"), ("g", "g"), ("ug", "ug"), ) DOSAGE_TIMING_CHOICES = ( ("SECONDS", "Seconds"), ("MINUTES", "Minutes"), ("HOURS", "Hours"), ("DAYS", "Days :D"), ("WEEKS", "Weeks :O"), ("MONTHS", "Months :-|"), ("YEARS", "Years x_X"), ) SEI_TYPE_CHOICES = ( ("PHYSICAL", "Physical"), ("COGNITIVE", "Cognitive"), ("VISUAL", "Visual"), ("AUDITORY", "Auditory"), ("MULTISENSORY", "Multi-sensory"), ("TRANSPERSONAL", "Transpersonal"), ) class User(AbstractUser): # Stripe customer ID stripe_id = models.CharField(max_length=255, null=True, blank=True) customer_id = models.UUIDField(default=uuid.uuid4, null=True, blank=True) billing_provider_id = models.CharField(max_length=255, null=True, blank=True) email = models.EmailField(unique=True) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self._original = self def get_notification_settings(self): return NotificationSettings.objects.get_or_create(user=self)[0] class NotificationSettings(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) ntfy_topic = models.CharField(max_length=255, null=True, blank=True) ntfy_url = models.CharField(max_length=255, null=True, blank=True) def __str__(self): return f"Notification settings for {self.user}" class Source(models.Model): name = models.CharField(max_length=255, unique=True) type = models.CharField(max_length=255, choices=SOURCE_TYPE_CHOICES) endpoint = models.CharField(max_length=1024, blank=True, null=True) score = models.IntegerField(blank=True) class Entry(models.Model): source = models.ForeignKey(Source) slug = models.CharField(max_length=1024) class Dosage(models.Model): entry = models.ForeignKey("core.Entry") unit = models.CharField(max_length=255, choices=DOSAGE_UNIT_CHOICES) threshold = models.IntegerField() light = models.IntegerField() common = models.IntegerField() strong = models.IntegerField() heavy = models.IntegerField() class Timing(models.Model): entry = models.ForeignKey("core.Entry") unit = models.CharField( max_length=255, choices=DOSAGE_TIMING_CHOICES, default="HOURS" ) onset = models.IntegerField() comeup = models.IntegerField() peak = models.IntegerField() total = models.IntegerField() class SEI(models.Model): """ Subjective Effect Index from Psychonaut Wiki. """ type = models.CharField( max_length=255, choices=SEI_TYPE_CHOICES, default="PHYSICAL" ) description = models.CharField(max_length=4096, blank=True, null=True) class Effect(models.Model): entry = models.ForeignKey("core.Entry") subjective_effects = models.ManyToManyField(SEI) class Action(models.Model): """ Site action record for a drug. """ site = models.CharField(max_length=255, choices=SITE_CHOICES) mechanism = models.CharField(max_length=255, choices=MECHANISM_CHOICES) affinity = models.IntegerField(blank=True) class Drug(models.Model): """ Model of a drug. Not open to interpretation. """ # Lysergic acid diethylamide, Phenibut name = models.CharField(max_length=255, unique=True) # Psychedelic, Sedative drug_class = models.CharField(max_length=255) # LSD common_name = models.CharField(max_length=1024, unique=True) links = models.ManyToManyField(Entry) dosages = models.ManyToManyField(Dosage) timings = models.ManyToManyField(Timing) effects = models.ManyToManyField(Effect) actions = models.ManyToManyField(Action) # class Perms(models.Model): # class Meta: # permissions = ( # ("bypass_hashing", "Can bypass field hashing"), # # ("bypass_blacklist", "Can bypass the blacklist"), # # ("bypass_encryption", "Can bypass field encryption"), # # ("bypass_obfuscation", "Can bypass field obfuscation"), # # ("bypass_delay", "Can bypass data delay"), # # ("bypass_randomisation", "Can bypass data randomisation"), # # ("post_irc", "Can post to IRC"), # ("post_discord", "Can post to Discord"), # ("query_search", "Can search with query strings"), # # ("use_insights", "Can use the Insights page"), # ("index_int", "Can use the internal index"), # ("index_meta", "Can use the meta index"), # ("restricted_sources", "Can access restricted sources"), # )