Skip to content

Commit

Permalink
Merge pull request #398 from kids-first/refferal-token
Browse files Browse the repository at this point in the history
✨ Add ReferralToken Model and create referral tokens mutation
  • Loading branch information
XuTheBunny committed May 27, 2020
2 parents c79685c + 27bab53 commit 4e47c31
Show file tree
Hide file tree
Showing 20 changed files with 1,008 additions and 44 deletions.
4 changes: 2 additions & 2 deletions creator/email/templates/invite.html
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@

<p>
<a
href="https://kf-ui-data-tracker.kidsfirstdrc.org/"
style="background: #f3f3f3;padding: 10px;border-radius: 7px;"
href="{{ url }}"
style="background: #f3f3f3; padding: 10px; border-radius: 7px;"
>Take me to my studies</a
>
</p>
Expand Down
18 changes: 18 additions & 0 deletions creator/events/migrations/0011_add_referral_tokens_status.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 2.1.11 on 2020-05-26 20:15

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('events', '0010_add_phenotype_status'),
]

operations = [
migrations.AlterField(
model_name='event',
name='event_type',
field=models.CharField(choices=[('SF_CRE', 'Study File Created'), ('SF_UPD', 'Study File Updated'), ('SF_DEL', 'Study File Deleted'), ('FV_CRE', 'File Version Created'), ('FV_UPD', 'File Version Updated'), ('SD_CRE', 'Study Created'), ('SD_UPD', 'Study Updated'), ('PR_CRE', 'Project Created'), ('PR_UPD', 'Project Updated'), ('PR_DEL', 'Project Deleted'), ('PR_LIN', 'Project Linked'), ('PR_UNL', 'Project Unlinked'), ('PR_STR', 'Project Creation Start'), ('PR_ERR', 'Project Creation Error'), ('PR_SUC', 'Project Creation Success'), ('BK_STR', 'Bucket Creation Start'), ('BK_ERR', 'Bucket Creation Error'), ('BK_SUC', 'Bucket Creation Success'), ('BK_LIN', 'Bucket Linked'), ('BK_UNL', 'Bucket Unlinked'), ('IM_STR', 'File Import Start'), ('IM_ERR', 'File Import Error'), ('IM_SUC', 'File Import Success'), ('CB_ADD', 'Collaborator Added'), ('CB_REM', 'Collaborator Removed'), ('IN_UPD', 'Ingestion Status Updated'), ('PH_UPD', 'Phenotype Status Updated'), ('ST_UPD', 'Sequencing Status Updated'), ('RT_CRE', 'Referral Token Created'), ('RT_CLA', 'Referral Token Claimed'), ('OTH', 'Other')], default='OTH', max_length=6),
),
]
2 changes: 2 additions & 0 deletions creator/events/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,8 @@ class Meta:
("IN_UPD", "Ingestion Status Updated"),
("PH_UPD", "Phenotype Status Updated"),
("ST_UPD", "Sequencing Status Updated"),
("RT_CRE", "Referral Token Created"),
("RT_CLA", "Referral Token Claimed"),
("OTH", "Other"),
),
default="OTH",
Expand Down
3 changes: 3 additions & 0 deletions creator/groups.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,9 @@
"unlink_project",
"import_volume",
"sync_project",
"view_referraltoken",
"list_all_referraltoken",
"add_referraltoken",
],
"Developers": [
"view_study",
Expand Down
16 changes: 16 additions & 0 deletions creator/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,22 @@ class Meta:
def is_admin(self):
return 'ADMIN' in self.ego_roles

@property
def display_name(self):
"""
Display user first name last name if exist, and username if not
"""
user_name = self.username if self.username else "Unknown user"
user_full_name = (
(
(self.first_name if self.first_name + " " else "")
+ (self.last_name if self.last_name else "")
)
if (self.first_name or self.last_name)
else user_name
)
return user_full_name


class Job(models.Model):
"""
Expand Down
Empty file.
5 changes: 5 additions & 0 deletions creator/referral_tokens/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from django.apps import AppConfig


class ReferralTokensConfig(AppConfig):
name = "referral_tokens"
15 changes: 15 additions & 0 deletions creator/referral_tokens/factories.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import pytz
import factory
from .models import ReferralToken


class ReferralTokenFactory(factory.DjangoModelFactory):
class Meta:
model = ReferralToken
django_get_or_create = ("uuid",)

uuid = factory.Faker("uuid4")
email = factory.Faker("email")
created_at = factory.Faker(
"date_time_between", start_date="-2d", end_date="now", tzinfo=pytz.UTC
)
37 changes: 37 additions & 0 deletions creator/referral_tokens/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# Generated by Django 2.1.11 on 2020-05-22 20:07

from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
import uuid


class Migration(migrations.Migration):

initial = True

dependencies = [
('auth', '0009_alter_user_last_name_max_length'),
('studies', '0016_add_phenotype_status'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]

operations = [
migrations.CreateModel(
name='ReferralToken',
fields=[
('uuid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)),
('email', models.EmailField(help_text='The email that the token link will be sent to', max_length=254)),
('claimed', models.BooleanField(default=False, help_text='If the token has been used')),
('created_at', models.DateTimeField(default=django.utils.timezone.now, help_text='Time the referral token was created')),
('claimed_by', models.ForeignKey(blank=True, help_text='The user who claims the token', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='referral_tokens_claimed_by', to=settings.AUTH_USER_MODEL)),
('created_by', models.ForeignKey(blank=True, help_text='The user who created the token', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='referral_tokens_created_by', to=settings.AUTH_USER_MODEL)),
('groups', models.ManyToManyField(blank=True, help_text='The role the user will assume in these studies', related_name='referral_tokens', related_query_name='referral_tokens', to='auth.Group')),
('studies', models.ManyToManyField(help_text='List of studies that the user will be added to', related_name='referral_tokens', to='studies.Study')),
],
options={
'permissions': [('list_all_referraltoken', 'Can view all referral tokens')],
},
),
]
Empty file.
94 changes: 94 additions & 0 deletions creator/referral_tokens/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
import uuid
import pytz
from datetime import datetime
from django.db import models
from django.utils import timezone
from django.contrib.auth import get_user_model
from django.conf import settings
from creator.studies.models import Study
from django.contrib.auth.models import Group


User = get_user_model()


class ReferralToken(models.Model):
"""
An ReferralToken will be exchanged by a new or existing user in order to
be added to a studies with a given role.
"""

class Meta:
permissions = [
("list_all_referraltoken", "Can view all referral tokens"),
]

uuid = models.UUIDField(
default=uuid.uuid4, unique=True, editable=False, primary_key=True
)

email = models.EmailField(
max_length=254,
help_text="The email that the token link will be sent to",
)

claimed = models.BooleanField(
default=False, help_text="If the token has been used"
)

studies = models.ManyToManyField(
Study,
related_name="referral_tokens",
help_text="List of studies that the user will be added to",
)

groups = models.ManyToManyField(
Group,
blank=True,
help_text="The role the user will assume in these studies",
related_name="referral_tokens",
related_query_name="referral_tokens",
)

created_at = models.DateTimeField(
default=timezone.now,
null=False,
help_text="Time the referral token was created",
)

claimed_by = models.ForeignKey(
User,
related_name="referral_tokens_claimed_by",
help_text="The user who claims the token",
null=True,
blank=True,
on_delete=models.SET_NULL,
)

created_by = models.ForeignKey(
User,
related_name="referral_tokens_created_by",
help_text="The user who created the token",
null=True,
blank=True,
on_delete=models.SET_NULL,
)

@property
def is_valid(self):
"""
If the token has already been claimed or if it has expired
"""

exp_length = settings.REFERRAL_TOKEN_EXPIRATION_DAYS
expired = (
datetime.now().replace(tzinfo=pytz.UTC) - self.created_at
).days > exp_length
return not self.claimed and not expired

@property
def invite_url(self):
"""
User invitation url
"""
return f"{settings.DATA_TRACKER_URL}/join?token={self.uuid}"
Loading

0 comments on commit 4e47c31

Please sign in to comment.