Skip to content

Commit

Permalink
Merge pull request #2431 from carpentries/2408-create-get-involved-re…
Browse files Browse the repository at this point in the history
…quirement

Create "Get Involved" requirement and associated Involvement model
  • Loading branch information
elichad committed Jun 28, 2023
2 parents 027dc20 + c11cfea commit 6995085
Show file tree
Hide file tree
Showing 23 changed files with 1,279 additions and 307 deletions.
1 change: 1 addition & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ jobs:
matrix:
python-version: [ '3.11' ]
test-type: ["Unit", "Migration"]
fail-fast: false

services:
postgres:
Expand Down
1 change: 1 addition & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ dev_database :
${MANAGE} runscript seed_autoemails
${MANAGE} runscript seed_communityroles
${MANAGE} runscript seed_training_requirements
${MANAGE} runscript seed_involvements
${MANAGE} create_superuser
${MANAGE} fake_database
${MANAGE} createinitialrevisions
Expand Down
18 changes: 18 additions & 0 deletions amy/api/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from communityroles.models import CommunityRoleConfig
from consents.models import Consent, Term
from recruitment.models import InstructorRecruitment
from trainings.models import Involvement
from workshops.models import (
Airport,
Award,
Expand Down Expand Up @@ -410,11 +411,25 @@ class Meta:
"name",
"url_required",
"event_required",
"involvement_required",
)


class InvolvementSerializer(serializers.ModelSerializer):
class Meta:
model = Involvement
fields = (
"name",
"display_name",
"url_required",
"date_required",
"notes_required",
)


class TrainingProgressSerializer(serializers.ModelSerializer):
requirement = TrainingRequirementSerializer(many=False, read_only=True)
involvement_type = InvolvementSerializer(many=False, read_only=True)
state = serializers.CharField(source="get_state_display")
event = EventSerializerSimplified(many=False, read_only=True)

Expand All @@ -424,9 +439,12 @@ class Meta:
"created_at",
"last_updated_at",
"requirement",
"involvement_type",
"state",
"event",
"url",
"date",
"trainee_notes",
)


Expand Down
41 changes: 36 additions & 5 deletions amy/api/tests/test_export.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from rest_framework.test import APITestCase

from consents.models import Consent, Term
from trainings.models import Involvement
from workshops.models import (
Airport,
Award,
Expand Down Expand Up @@ -185,15 +186,31 @@ def prepare_data(self, user):
event=event,
url=None,
)
lesson_contribution, _ = TrainingRequirement.objects.get_or_create(
name="Lesson Contribution", defaults={"url_required": True}
get_involved, _ = TrainingRequirement.objects.get_or_create(
name="Get Involved",
defaults={
"url_required": False,
"event_required": False,
"involvement_required": True,
},
)
github_contribution, _ = Involvement.objects.get_or_create(
name="GitHub Contribution",
defaults={
"display_name": "Submitted a contribution to a Carpentries repository",
"url_required": True,
"date_required": True,
},
)
TrainingProgress.objects.create(
trainee=self.user,
requirement=lesson_contribution,
requirement=get_involved,
involvement_type=github_contribution,
state="a", # asked to repeat
event=None,
url="http://example.org/lesson",
date=datetime.date(2023, 5, 31),
trainee_notes="Notes submitted by trainee",
)
terms = (
Term.objects.active()
Expand Down Expand Up @@ -507,7 +524,9 @@ def test_relational_fields_structure(self):
"name": "Welcome Session",
"url_required": False,
"event_required": False,
"involvement_required": False,
},
"involvement_type": None,
"state": "Passed",
"event": {
"slug": "2018-06-16-AMY-event",
Expand All @@ -522,20 +541,32 @@ def test_relational_fields_structure(self):
"longitude": None,
},
"url": None,
"date": None,
"trainee_notes": "",
},
{
# these are generated by Django, so we borrow them from the
# output
"created_at": data["training_progresses"][1]["created_at"],
"last_updated_at": data["training_progresses"][1]["last_updated_at"],
"requirement": {
"name": "Lesson Contribution",
"url_required": True,
"name": "Get Involved",
"url_required": False,
"event_required": False,
"involvement_required": True,
},
"involvement_type": {
"name": "GitHub Contribution",
"display_name": "Submitted a contribution to a Carpentries repository", # noqa
"url_required": True,
"date_required": True,
"notes_required": False,
},
"state": "Asked to repeat",
"event": None,
"url": "http://example.org/lesson",
"date": "2023-05-31",
"trainee_notes": "Notes submitted by trainee",
},
]
self.assertEqual(len(data["training_progresses"]), 2)
Expand Down
4 changes: 0 additions & 4 deletions amy/consents/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -225,10 +225,6 @@ def is_archived(self) -> bool:
def is_active(self) -> bool:
return self.archived_at is None

def archive(self) -> None:
self.archived_at = timezone.now()
self.save()


class ConsentQuerySet(QuerySet):
def active(self):
Expand Down
73 changes: 73 additions & 0 deletions amy/scripts/seed_involvements.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
import logging
from typing import TypedDict

from trainings.models import Involvement
from workshops.utils.seeding import deprecate_models, seed_models

logger = logging.getLogger("amy")

# If an entry needs to be removed from the database, remove it from e.g.
# `EMAIL_TEMPLATES`, and put its' ID in `DEPRECATED_EMAIL_TEMPLATES`.

DEPRECATED_INVOLVEMENTS: list[str] = []

InvolvementDef = TypedDict(
"InvolvementDef",
{
"display_name": str,
"name": str,
"url_required": bool,
"date_required": bool,
},
)

INVOLVEMENTS: list[InvolvementDef] = [
{
"display_name": "Served as an Instructor or a helper at a Carpentries workshop",
"name": "Workshop Instructor/Helper",
"url_required": True,
"date_required": True,
"notes_required": False,
},
{
"display_name": "Attended an Instructor Meeting, regional meetup, or other community meeting", # noqa
"name": "Community Meeting",
"url_required": False,
"date_required": True,
"notes_required": True,
},
{
"display_name": "Submitted a contribution to a Carpentries repository",
"name": "GitHub Contribution",
"url_required": True,
"date_required": True,
"notes_required": False,
},
{
"display_name": "Other",
"name": "Other",
"url_required": False,
"date_required": True,
"notes_required": True,
},
]

# --------------------------------------------------------------------------------------


def involvement_transform(
involvement_def: dict,
) -> Involvement:
return Involvement(**involvement_def)


def run() -> None:
seed_models(
Involvement,
INVOLVEMENTS,
"name",
involvement_transform,
logger,
)

deprecate_models(Involvement, DEPRECATED_INVOLVEMENTS, "name", logger)
29 changes: 25 additions & 4 deletions amy/scripts/seed_training_requirements.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,35 @@
"name": str,
"url_required": bool,
"event_required": bool,
"involvement_required": bool,
},
)

TRAINING_REQUIREMENTS: list[TrainingRequirementDef] = [
{"name": "Training", "url_required": False, "event_required": True},
{"name": "Welcome Session", "url_required": False, "event_required": False},
{"name": "Lesson Contribution", "url_required": True, "event_required": False},
{"name": "Demo", "url_required": False, "event_required": False},
{
"name": "Training",
"url_required": False,
"event_required": True,
"involvement_required": False,
},
{
"name": "Welcome Session",
"url_required": False,
"event_required": False,
"involvement_required": False,
},
{
"name": "Get Involved",
"url_required": False,
"event_required": False,
"involvement_required": True,
},
{
"name": "Demo",
"url_required": False,
"event_required": False,
"involvement_required": False,
},
]

# --------------------------------------------------------------------------------------
Expand Down
Loading

0 comments on commit 6995085

Please sign in to comment.