Skip to content
This repository was archived by the owner on Nov 17, 2023. It is now read-only.

Commit 3c969bc

Browse files
authored
Merge pull request #106 from VariantEffect/manage_adduser
Adds two new manage.py commands to help with batch changes
2 parents 1dceea8 + 0a97353 commit 3c969bc

File tree

5 files changed

+232
-1
lines changed

5 files changed

+232
-1
lines changed

data/main/site_info.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@
66
"md_privacy": "",
77
"md_terms": "",
88
"md_usage_guide": "",
9-
"version": "1.7.0"
9+
"version": "1.7.1"
1010
}

dataset/constants.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,8 @@
4949
processing = "processing"
5050
failed = "failed"
5151
success = "success"
52+
53+
# User roles
54+
administrator = "administrator"
55+
editor = "editor"
56+
viewer = "viewer"
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import sys
2+
from django.core.management.base import BaseCommand
3+
4+
from urn.models import get_model_by_urn
5+
from metadata.models import PubmedIdentifier
6+
from metadata.validators import validate_pubmed_identifier
7+
8+
9+
class Command(BaseCommand):
10+
def add_arguments(self, parser):
11+
parser.add_argument("--urn", type=str, help="Dataset URN")
12+
parser.add_argument("--pmid", type=str, help="PubMed identifier")
13+
14+
def handle(self, *args, **kwargs):
15+
urn = kwargs.get("urn", None)
16+
if not urn:
17+
raise ValueError("A valid URN is required.")
18+
19+
pmid = kwargs.get("pmid", None)
20+
if not pmid:
21+
raise ValueError("A PubMed ID is required.")
22+
validate_pubmed_identifier(pmid)
23+
24+
pmid_instance, created = PubmedIdentifier.objects.get_or_create(
25+
identifier=pmid
26+
)
27+
instance = get_model_by_urn(urn)
28+
instance.pubmed_ids.add(pmid_instance)
29+
instance.save()
30+
sys.stdout.write("Added PMID {} to {}.\n".format(pmid, instance))
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import sys
2+
from django.core.management.base import BaseCommand
3+
from django.contrib.auth import get_user_model
4+
5+
from dataset import constants
6+
from urn.models import get_model_by_urn
7+
8+
User = get_user_model()
9+
10+
11+
class Command(BaseCommand):
12+
def add_arguments(self, parser):
13+
parser.add_argument("--user", type=str, help="User ORCID")
14+
parser.add_argument("--urn", type=str, help="Dataset URN")
15+
parser.add_argument("--role", type=str, help="User role")
16+
17+
def handle(self, *args, **kwargs):
18+
role = kwargs.get("role", None)
19+
valid_states = (
20+
constants.administrator,
21+
constants.editor,
22+
constants.viewer,
23+
)
24+
if role not in valid_states:
25+
raise ValueError(
26+
"Valid states are {}.".format(
27+
"{} or {}".format(
28+
", ".join(valid_states[:-1]), valid_states[-1]
29+
)
30+
)
31+
)
32+
33+
urn = kwargs.get("urn", None)
34+
if not urn:
35+
raise ValueError("A valid URN is required.")
36+
37+
user = kwargs.get("user", None)
38+
if not user:
39+
raise ValueError("A valid user is required.")
40+
41+
instance = get_model_by_urn(urn)
42+
user_model = User.objects.get(username=user)
43+
if role == constants.administrator:
44+
instance.add_administrators(user_model)
45+
elif role == constants.editor:
46+
instance.add_editors(user_model)
47+
elif role == constants.viewer:
48+
instance.add_viewers(user_model)
49+
else:
50+
raise ValueError("Invalid user role.")
51+
instance.save()
52+
sys.stdout.write(
53+
"Added {} to {} with role {}.\n".format(user, instance, role)
54+
)

main/tests/test_commands.py

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
from django.test import TestCase
2+
from django.core.management import call_command
3+
from django.core.exceptions import ValidationError, ObjectDoesNotExist
4+
5+
from accounts.factories import UserFactory
6+
from dataset.factories import ScoreSetFactory
7+
from metadata.factories import PubmedIdentifierFactory
8+
from metadata.models import PubmedIdentifier
9+
from dataset import constants
10+
11+
12+
class TestAddPmidCommand(TestCase):
13+
def test_value_error_invalid_urn(self):
14+
with self.assertRaises(ValueError):
15+
call_command("addpmid", pmid="25075907", urn=None)
16+
17+
def test_validation_error_invalid_pmid(self):
18+
instance = ScoreSetFactory()
19+
20+
with self.assertRaises(ValidationError):
21+
call_command("addpmid", pmid="abc", urn=instance.urn)
22+
23+
with self.assertRaises(ValueError):
24+
call_command("addpmid", pmid=None, urn=instance.urn)
25+
26+
def test_retrieves_existing_pmid(self):
27+
instance = ScoreSetFactory()
28+
pmid = "25075907"
29+
PubmedIdentifier.objects.all().delete()
30+
PubmedIdentifierFactory(identifier=pmid)
31+
32+
self.assertEqual(PubmedIdentifier.objects.count(), 1)
33+
call_command("addpmid", pmid=pmid, urn=instance.urn)
34+
35+
pmid_instance = PubmedIdentifier.objects.first()
36+
self.assertEqual(PubmedIdentifier.objects.count(), 1)
37+
self.assertEqual(pmid_instance.identifier, pmid)
38+
self.assertIsNotNone(pmid_instance.reference_html)
39+
self.assertIn(pmid_instance, instance.pubmed_ids.all())
40+
41+
def test_creates_new_pmid(self):
42+
instance = ScoreSetFactory()
43+
pmid = "25075907"
44+
PubmedIdentifier.objects.all().delete()
45+
46+
self.assertEqual(PubmedIdentifier.objects.count(), 0)
47+
call_command("addpmid", pmid=pmid, urn=instance.urn)
48+
49+
pmid_instance = PubmedIdentifier.objects.first()
50+
self.assertEqual(PubmedIdentifier.objects.count(), 1)
51+
self.assertEqual(pmid_instance.identifier, pmid)
52+
self.assertIsNotNone(pmid_instance.reference_html)
53+
self.assertIn(pmid_instance, instance.pubmed_ids.all())
54+
55+
56+
class TestAddUserCommand(TestCase):
57+
def test_error_invalid_urn(self):
58+
user = UserFactory()
59+
60+
with self.assertRaises(ValueError):
61+
call_command(
62+
"adduser",
63+
user=user.username,
64+
urn=None,
65+
role=constants.administrator,
66+
)
67+
68+
def test_error_urn_doesnt_exist(self):
69+
user = UserFactory()
70+
with self.assertRaises(ObjectDoesNotExist):
71+
call_command(
72+
"adduser",
73+
user=user.username,
74+
urn="urn:mavedb:00000001-a-1",
75+
role=constants.administrator,
76+
)
77+
78+
def test_error_invalid_username(self):
79+
instance = ScoreSetFactory()
80+
with self.assertRaises(ValueError):
81+
call_command(
82+
"adduser",
83+
user=None,
84+
urn=instance.urn,
85+
role=constants.administrator,
86+
)
87+
88+
def test_error_user_doesnt_exist(self):
89+
instance = ScoreSetFactory()
90+
with self.assertRaises(ObjectDoesNotExist):
91+
call_command(
92+
"adduser",
93+
user="user_a",
94+
urn=instance.urn,
95+
role=constants.administrator,
96+
)
97+
98+
def test_error_invalid_role(self):
99+
user = UserFactory()
100+
instance = ScoreSetFactory()
101+
102+
with self.assertRaises(ValueError):
103+
call_command(
104+
"adduser",
105+
user=user.username,
106+
urn=instance.urn,
107+
role="not a role",
108+
)
109+
110+
def test_adds_user_to_role(self):
111+
user = UserFactory()
112+
instance = ScoreSetFactory()
113+
114+
call_command(
115+
"adduser",
116+
user=user.username,
117+
urn=instance.urn,
118+
role=constants.administrator,
119+
)
120+
self.assertIn(user, instance.administrators)
121+
self.assertNotIn(user, instance.editors)
122+
self.assertNotIn(user, instance.viewers)
123+
124+
call_command(
125+
"adduser",
126+
user=user.username,
127+
urn=instance.urn,
128+
role=constants.editor,
129+
)
130+
self.assertIn(user, instance.editors)
131+
self.assertNotIn(user, instance.administrators)
132+
self.assertNotIn(user, instance.viewers)
133+
134+
call_command(
135+
"adduser",
136+
user=user.username,
137+
urn=instance.urn,
138+
role=constants.viewer,
139+
)
140+
self.assertIn(user, instance.viewers)
141+
self.assertNotIn(user, instance.administrators)
142+
self.assertNotIn(user, instance.editors)

0 commit comments

Comments
 (0)