meta-edc 0.3.53__py3-none-any.whl → 1.0.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- meta_ae/action_items.py +9 -4
- meta_ae/admin/ae_initial_admin.py +5 -2
- meta_ae/admin/modeladmin_mixins.py +5 -3
- meta_ae/templatetags/meta_ae_extras.py +1 -3
- meta_consent/action_items.py +1 -0
- meta_consent/migrations/0030_auto_20250120_2114.py +40 -0
- meta_consent/migrations/0031_alter_historicalsubjectconsent_guardian_name_and_more.py +124 -0
- meta_dashboard/templates/meta_dashboard/{bootstrap3/subject → subject}/dashboard/sidebar.html +1 -1
- meta_dashboard/templates/meta_dashboard/{bootstrap3/subject → subject}/dashboard/top_bar.html +1 -1
- meta_dashboard/templates/meta_dashboard/subject/dashboard.html +14 -0
- meta_dashboard/templatetags/meta_dashboard_extras.py +6 -11
- meta_dashboard/views/subject/dashboard/dashboard_view.py +6 -5
- meta_edc/admin.py +2 -3
- meta_edc/settings/debug.py +2 -2
- meta_edc/settings/defaults.py +1 -3
- meta_edc/templates/meta_edc/{bootstrap3/base.html → base.html} +1 -1
- meta_edc/templates/meta_edc/{bootstrap3/home.html → home.html} +1 -1
- meta_edc/views/home_view.py +1 -2
- {meta_edc-0.3.53.dist-info → meta_edc-1.0.1.dist-info}/METADATA +2 -2
- {meta_edc-0.3.53.dist-info → meta_edc-1.0.1.dist-info}/RECORD +56 -50
- meta_prn/action_items.py +23 -16
- meta_prn/admin/end_of_study_admin.py +12 -6
- meta_prn/admin/offschedule_admin.py +8 -6
- meta_prn/admin/offschedule_dm_referral_admin.py +8 -6
- meta_prn/admin/offschedule_postnatal_admin.py +10 -1
- meta_prn/admin/offschedule_pregnancy_admin.py +10 -1
- meta_prn/choices.py +4 -0
- meta_prn/form_validators/end_of_study.py +10 -4
- meta_prn/templates/meta_prn/eos/additional_instructions.html +3 -0
- meta_prn/templates/meta_prn/offschedule/additional_instructions.html +2 -0
- meta_prn/tests/tests/test_eos_events.py +134 -0
- meta_reports/admin/dbviews/imp_substitutions_admin.py +1 -1
- meta_reports/admin/dbviews/missing_screening_ogtt_admin/unmanaged_model_admin.py +1 -1
- meta_reports/admin/dbviews/patient_history_missing_baseline_cd4_admin.py +1 -1
- meta_reports/admin/last_imp_refill_admin.py +5 -19
- meta_reports/templates/meta_reports/last_imp_refill/changelist_note.html +13 -0
- meta_screening/admin/subject_screening_admin.py +13 -3
- meta_screening/eligibility/eligibility.py +14 -7
- meta_screening/model_mixins/part_one_fields_model_mixin.py +15 -14
- meta_subject/admin/birth_outcome_admin.py +1 -1
- meta_subject/admin/delivery_admin.py +1 -1
- meta_subject/form_validators/dm_endpoint_form_validator.py +3 -1
- meta_subject/models/diabetes/dm_followup.py +3 -3
- tests/test_settings.py +0 -1
- meta_dashboard/templates/meta_dashboard/bootstrap3/subject/dashboard.html +0 -14
- /meta_ae/templates/meta_ae/{bootstrap3/ae_initial_description.html → aeinitial_description.html} +0 -0
- /meta_dashboard/templates/meta_dashboard/{bootstrap3/buttons → buttons}/add_consent_button.html +0 -0
- /meta_dashboard/templates/meta_dashboard/{bootstrap3/buttons → buttons}/dashboard_button.html +0 -0
- /meta_dashboard/templates/meta_dashboard/{bootstrap3/buttons → buttons}/eligibility_button.html +0 -0
- /meta_dashboard/templates/meta_dashboard/{bootstrap3/buttons → buttons}/refusal_button.html +0 -0
- /meta_dashboard/templates/meta_dashboard/{bootstrap3/buttons → buttons}/screening_button.html +0 -0
- /meta_dashboard/templates/meta_dashboard/{bootstrap3/screening → screening}/listboard.html +0 -0
- /meta_dashboard/templates/meta_dashboard/{bootstrap3/subject → subject}/listboard.html +0 -0
- {meta_edc-0.3.53.dist-info → meta_edc-1.0.1.dist-info}/AUTHORS +0 -0
- {meta_edc-0.3.53.dist-info → meta_edc-1.0.1.dist-info}/LICENSE +0 -0
- {meta_edc-0.3.53.dist-info → meta_edc-1.0.1.dist-info}/WHEEL +0 -0
- {meta_edc-0.3.53.dist-info → meta_edc-1.0.1.dist-info}/top_level.txt +0 -0
meta_ae/action_items.py
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
from django.apps import apps as django_apps
|
2
2
|
from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist
|
3
|
+
from django.utils.html import format_html
|
3
4
|
from django.utils.safestring import mark_safe
|
5
|
+
from django.utils.translation import gettext as _
|
4
6
|
from edc_action_item import ActionWithNotification, site_action_items
|
5
7
|
from edc_adverse_event.constants import (
|
6
8
|
AE_FOLLOWUP_ACTION,
|
@@ -39,10 +41,13 @@ class AeFollowupAction(ActionWithNotification):
|
|
39
41
|
create_by_user = False
|
40
42
|
show_link_to_changelist = True
|
41
43
|
admin_site_name = "meta_ae_admin"
|
42
|
-
instructions =
|
43
|
-
|
44
|
-
|
45
|
-
|
44
|
+
instructions = format_html(
|
45
|
+
_(
|
46
|
+
"Upon submission the TMG group will be notified "
|
47
|
+
'by email at <a href="mailto:{email1}">{email2}</a>'
|
48
|
+
),
|
49
|
+
email1=get_email_contacts("tmg") or "#",
|
50
|
+
email2=get_email_contacts("tmg") or "unknown",
|
46
51
|
)
|
47
52
|
priority = HIGH_PRIORITY
|
48
53
|
|
@@ -1,5 +1,6 @@
|
|
1
1
|
from django.contrib import admin
|
2
2
|
from django.utils.html import format_html
|
3
|
+
from django.utils.translation import gettext as _
|
3
4
|
from edc_adverse_event.modeladmin_mixins import AeInitialModelAdminMixin
|
4
5
|
from edc_model_admin.history import SimpleHistoryAdmin
|
5
6
|
from edc_notification.utils import get_email_contacts
|
@@ -15,8 +16,10 @@ class AeInitialAdmin(SiteModelAdminMixin, AeInitialModelAdminMixin, SimpleHistor
|
|
15
16
|
form = AeInitialForm
|
16
17
|
email_contact = get_email_contacts("ae_reports")
|
17
18
|
additional_instructions = format_html(
|
18
|
-
|
19
|
-
|
19
|
+
_(
|
20
|
+
"Complete the initial AE report and forward to the TMG. "
|
21
|
+
'Email to <a href="mailto:{}">{}</a>'
|
22
|
+
),
|
20
23
|
email_contact,
|
21
24
|
email_contact,
|
22
25
|
)
|
@@ -6,6 +6,7 @@ from django.template.loader import render_to_string
|
|
6
6
|
from django.urls.base import reverse
|
7
7
|
from django.utils.html import format_html
|
8
8
|
from django.utils.safestring import mark_safe
|
9
|
+
from django.utils.translation import gettext as _
|
9
10
|
from django_audit_fields.admin import audit_fieldset_tuple
|
10
11
|
from edc_action_item import action_fieldset_tuple
|
11
12
|
from edc_action_item.modeladmin_mixins import ActionItemModelAdminMixin
|
@@ -96,8 +97,8 @@ class AeReviewModelAdminMixin(
|
|
96
97
|
if follow_up_reports:
|
97
98
|
return format_html(
|
98
99
|
"{}. See {}",
|
99
|
-
mark_safe(obj.get_outcome_display()), # nosec B703, B308
|
100
|
-
mark_safe(follow_up_reports), # nosec B703, B308
|
100
|
+
mark_safe(_(obj.get_outcome_display())), # nosec B703, B308
|
101
|
+
mark_safe(_(follow_up_reports)), # nosec B703, B308
|
101
102
|
)
|
102
103
|
return obj.get_outcome_display()
|
103
104
|
|
@@ -111,8 +112,9 @@ class AeReviewModelAdminMixin(
|
|
111
112
|
namespace = self.admin_site.name
|
112
113
|
url = reverse(f"{namespace}:{url_name}_changelist")
|
113
114
|
return format_html(
|
114
|
-
'<a data-toggle="tooltip" title="
|
115
|
+
'<a data-toggle="tooltip" title="{title}" '
|
115
116
|
'href="{url}?q={action_identifier}">{identifier}</a>',
|
117
|
+
title=_("go to ae initial report"),
|
116
118
|
url=mark_safe(url), # nosec B703, B308
|
117
119
|
action_identifier=mark_safe( # nosec B703, B308
|
118
120
|
obj.ae_initial.action_identifier
|
@@ -6,14 +6,12 @@ from django.conf import settings
|
|
6
6
|
from django.utils.safestring import mark_safe
|
7
7
|
from edc_adverse_event.utils import get_adverse_event_app_label
|
8
8
|
from edc_constants.constants import OTHER, YES
|
9
|
-
from edc_dashboard.utils import get_bootstrap_version
|
10
9
|
|
11
10
|
register = template.Library()
|
12
11
|
|
13
12
|
|
14
13
|
format_ae_description_template_name = (
|
15
|
-
f"{get_adverse_event_app_label()}/
|
16
|
-
f"ae_initial_description.html"
|
14
|
+
f"{get_adverse_event_app_label()}/ae_initial_description.html"
|
17
15
|
)
|
18
16
|
|
19
17
|
|
meta_consent/action_items.py
CHANGED
@@ -31,6 +31,7 @@ class ConsentV1ExtensionAction(Action):
|
|
31
31
|
show_on_dashboard = True
|
32
32
|
show_link_to_changelist = True
|
33
33
|
admin_site_name = "meta_consent_admin"
|
34
|
+
show_link_to_add = True
|
34
35
|
create_by_user = True
|
35
36
|
singleton = True
|
36
37
|
instructions = "Participant must complete as soon as able. "
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# Generated by Django 5.1.5 on 2025-01-20 18:14
|
2
|
+
|
3
|
+
from django.core.exceptions import ObjectDoesNotExist
|
4
|
+
from django.db import IntegrityError, migrations, transaction
|
5
|
+
from edc_action_item.models import ActionItem
|
6
|
+
from edc_registration.models import RegisteredSubject
|
7
|
+
from tqdm import tqdm
|
8
|
+
|
9
|
+
from meta_consent.action_items import ConsentV1ExtensionAction
|
10
|
+
|
11
|
+
|
12
|
+
def update_missing_action_items(apps, schema_editor):
|
13
|
+
total = RegisteredSubject.objects.all().count()
|
14
|
+
for obj in tqdm(RegisteredSubject.objects.all(), total=total):
|
15
|
+
try:
|
16
|
+
ActionItem.objects.get(
|
17
|
+
subject_identifier=obj.subject_identifier, action_type__name="consent_v1_ext"
|
18
|
+
)
|
19
|
+
except ObjectDoesNotExist:
|
20
|
+
try:
|
21
|
+
with transaction.atomic():
|
22
|
+
ConsentV1ExtensionAction(
|
23
|
+
subject_identifier=obj.subject_identifier,
|
24
|
+
skip_get_current_site=True,
|
25
|
+
site_id=obj.site_id,
|
26
|
+
)
|
27
|
+
except IntegrityError:
|
28
|
+
print(f"ERROR: Unable to create for {obj.subject_identifier}.")
|
29
|
+
|
30
|
+
|
31
|
+
class Migration(migrations.Migration):
|
32
|
+
|
33
|
+
dependencies = [
|
34
|
+
(
|
35
|
+
"meta_consent",
|
36
|
+
"0029_alter_historicalsubjectconsentv1ext_agrees_to_extension_and_more",
|
37
|
+
),
|
38
|
+
]
|
39
|
+
|
40
|
+
operations = []
|
@@ -0,0 +1,124 @@
|
|
1
|
+
# Generated by Django 5.1.5 on 2025-01-22 03:27
|
2
|
+
|
3
|
+
import django_crypto_fields.fields.encrypted_char_field
|
4
|
+
import django_crypto_fields.fields.lastname_field
|
5
|
+
import edc_consent.validators
|
6
|
+
from django.db import migrations, models
|
7
|
+
|
8
|
+
|
9
|
+
class Migration(migrations.Migration):
|
10
|
+
|
11
|
+
dependencies = [
|
12
|
+
("meta_consent", "0030_auto_20250120_2114"),
|
13
|
+
]
|
14
|
+
|
15
|
+
operations = [
|
16
|
+
migrations.AlterField(
|
17
|
+
model_name="historicalsubjectconsent",
|
18
|
+
name="guardian_name",
|
19
|
+
field=django_crypto_fields.fields.encrypted_char_field.EncryptedCharField(
|
20
|
+
blank=True,
|
21
|
+
help_text="Required only if participant is a minor.<BR>Format is 'LASTNAME, FIRSTNAME'. All uppercase separated by a comma. (Encryption: RSA local)",
|
22
|
+
max_length=71,
|
23
|
+
null=True,
|
24
|
+
validators=[edc_consent.validators.FullNameValidator()],
|
25
|
+
verbose_name="Guardian's last and first name",
|
26
|
+
),
|
27
|
+
),
|
28
|
+
migrations.AlterField(
|
29
|
+
model_name="historicalsubjectconsent",
|
30
|
+
name="is_incarcerated",
|
31
|
+
field=models.CharField(
|
32
|
+
choices=[("Yes", "Yes"), ("No", "No")],
|
33
|
+
help_text="If 'Yes' STOP participant cannot be consented.",
|
34
|
+
max_length=3,
|
35
|
+
null=True,
|
36
|
+
validators=[edc_consent.validators.eligible_if_no],
|
37
|
+
verbose_name="Is the participant under involuntary incarceration?",
|
38
|
+
),
|
39
|
+
),
|
40
|
+
migrations.AlterField(
|
41
|
+
model_name="historicalsubjectconsent",
|
42
|
+
name="witness_name",
|
43
|
+
field=django_crypto_fields.fields.lastname_field.LastnameField(
|
44
|
+
blank=True,
|
45
|
+
help_text="Required only if participant is illiterate.<BR>Format is 'LASTNAME, FIRSTNAME'. All uppercase separated by a comma. (Encryption: RSA local)",
|
46
|
+
max_length=71,
|
47
|
+
null=True,
|
48
|
+
validators=[edc_consent.validators.FullNameValidator()],
|
49
|
+
verbose_name="Witness's last and first name",
|
50
|
+
),
|
51
|
+
),
|
52
|
+
migrations.AlterField(
|
53
|
+
model_name="historicalsubjectconsentv1",
|
54
|
+
name="guardian_name",
|
55
|
+
field=django_crypto_fields.fields.encrypted_char_field.EncryptedCharField(
|
56
|
+
blank=True,
|
57
|
+
help_text="Required only if participant is a minor.<BR>Format is 'LASTNAME, FIRSTNAME'. All uppercase separated by a comma. (Encryption: RSA local)",
|
58
|
+
max_length=71,
|
59
|
+
null=True,
|
60
|
+
validators=[edc_consent.validators.FullNameValidator()],
|
61
|
+
verbose_name="Guardian's last and first name",
|
62
|
+
),
|
63
|
+
),
|
64
|
+
migrations.AlterField(
|
65
|
+
model_name="historicalsubjectconsentv1",
|
66
|
+
name="is_incarcerated",
|
67
|
+
field=models.CharField(
|
68
|
+
choices=[("Yes", "Yes"), ("No", "No")],
|
69
|
+
help_text="If 'Yes' STOP participant cannot be consented.",
|
70
|
+
max_length=3,
|
71
|
+
null=True,
|
72
|
+
validators=[edc_consent.validators.eligible_if_no],
|
73
|
+
verbose_name="Is the participant under involuntary incarceration?",
|
74
|
+
),
|
75
|
+
),
|
76
|
+
migrations.AlterField(
|
77
|
+
model_name="historicalsubjectconsentv1",
|
78
|
+
name="witness_name",
|
79
|
+
field=django_crypto_fields.fields.lastname_field.LastnameField(
|
80
|
+
blank=True,
|
81
|
+
help_text="Required only if participant is illiterate.<BR>Format is 'LASTNAME, FIRSTNAME'. All uppercase separated by a comma. (Encryption: RSA local)",
|
82
|
+
max_length=71,
|
83
|
+
null=True,
|
84
|
+
validators=[edc_consent.validators.FullNameValidator()],
|
85
|
+
verbose_name="Witness's last and first name",
|
86
|
+
),
|
87
|
+
),
|
88
|
+
migrations.AlterField(
|
89
|
+
model_name="subjectconsent",
|
90
|
+
name="guardian_name",
|
91
|
+
field=django_crypto_fields.fields.encrypted_char_field.EncryptedCharField(
|
92
|
+
blank=True,
|
93
|
+
help_text="Required only if participant is a minor.<BR>Format is 'LASTNAME, FIRSTNAME'. All uppercase separated by a comma. (Encryption: RSA local)",
|
94
|
+
max_length=71,
|
95
|
+
null=True,
|
96
|
+
validators=[edc_consent.validators.FullNameValidator()],
|
97
|
+
verbose_name="Guardian's last and first name",
|
98
|
+
),
|
99
|
+
),
|
100
|
+
migrations.AlterField(
|
101
|
+
model_name="subjectconsent",
|
102
|
+
name="is_incarcerated",
|
103
|
+
field=models.CharField(
|
104
|
+
choices=[("Yes", "Yes"), ("No", "No")],
|
105
|
+
help_text="If 'Yes' STOP participant cannot be consented.",
|
106
|
+
max_length=3,
|
107
|
+
null=True,
|
108
|
+
validators=[edc_consent.validators.eligible_if_no],
|
109
|
+
verbose_name="Is the participant under involuntary incarceration?",
|
110
|
+
),
|
111
|
+
),
|
112
|
+
migrations.AlterField(
|
113
|
+
model_name="subjectconsent",
|
114
|
+
name="witness_name",
|
115
|
+
field=django_crypto_fields.fields.lastname_field.LastnameField(
|
116
|
+
blank=True,
|
117
|
+
help_text="Required only if participant is illiterate.<BR>Format is 'LASTNAME, FIRSTNAME'. All uppercase separated by a comma. (Encryption: RSA local)",
|
118
|
+
max_length=71,
|
119
|
+
null=True,
|
120
|
+
validators=[edc_consent.validators.FullNameValidator()],
|
121
|
+
verbose_name="Witness's last and first name",
|
122
|
+
),
|
123
|
+
),
|
124
|
+
]
|
meta_dashboard/templates/meta_dashboard/{bootstrap3/subject → subject}/dashboard/top_bar.html
RENAMED
@@ -1,3 +1,3 @@
|
|
1
|
-
{% extends 'edc_subject_dashboard/
|
1
|
+
{% extends 'edc_subject_dashboard/dashboard/topbar.html' %}
|
2
2
|
|
3
3
|
{% block close_url %}href="{% url subject_listboard_url|default:'subject_listboard_url_cannot_be_none' %}?q={{ subject_identifier }}"{% endblock close_url %}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
{% extends 'edc_subject_dashboard/dashboard.html' %}
|
2
|
+
|
3
|
+
{% load static %}
|
4
|
+
|
5
|
+
{% block locator_information %}{% endblock locator_information %}
|
6
|
+
|
7
|
+
{% block top_bar %}
|
8
|
+
|
9
|
+
{% include "meta_dashboard/subject/dashboard/top_bar.html" %}
|
10
|
+
|
11
|
+
{% endblock top_bar %}
|
12
|
+
|
13
|
+
|
14
|
+
{% block side_bar %}{% include 'meta_dashboard/subject/dashboard/sidebar.html' %}{% endblock side_bar %}
|
@@ -6,7 +6,6 @@ from bs4 import BeautifulSoup
|
|
6
6
|
from django import template
|
7
7
|
from edc_constants.constants import TBD
|
8
8
|
from edc_dashboard.url_names import url_names
|
9
|
-
from edc_dashboard.utils import get_bootstrap_version
|
10
9
|
|
11
10
|
from meta_consent.models import SubjectConsent
|
12
11
|
from meta_dashboard.view_utils import (
|
@@ -29,9 +28,7 @@ if TYPE_CHECKING:
|
|
29
28
|
register = template.Library()
|
30
29
|
|
31
30
|
|
32
|
-
@register.inclusion_tag(
|
33
|
-
f"meta_dashboard/bootstrap{get_bootstrap_version()}/" f"buttons/eligibility_button.html"
|
34
|
-
)
|
31
|
+
@register.inclusion_tag("meta_dashboard/buttons/eligibility_button.html")
|
35
32
|
def eligibility_button(subject_screening: SubjectScreening):
|
36
33
|
comment = []
|
37
34
|
tooltip = None
|
@@ -52,7 +49,7 @@ def eligibility_button(subject_screening: SubjectScreening):
|
|
52
49
|
|
53
50
|
|
54
51
|
@register.inclusion_tag(
|
55
|
-
|
52
|
+
"meta_dashboard/buttons/add_consent_button.html",
|
56
53
|
takes_context=True,
|
57
54
|
)
|
58
55
|
def render_consent_button(context, subject_screening: SubjectScreening):
|
@@ -77,9 +74,7 @@ def refusal_button(context, subject_refusal):
|
|
77
74
|
)
|
78
75
|
|
79
76
|
|
80
|
-
@register.inclusion_tag(
|
81
|
-
f"edc_listboard/bootstrap{get_bootstrap_version()}/buttons/dashboard_button.html"
|
82
|
-
)
|
77
|
+
@register.inclusion_tag("edc_listboard/buttons/dashboard_button.html")
|
83
78
|
def render_dashboard_button(subject_consent: SubjectConsent):
|
84
79
|
subject_dashboard_url = url_names.get("subject_dashboard_url")
|
85
80
|
return dict(
|
@@ -89,7 +84,7 @@ def render_dashboard_button(subject_consent: SubjectConsent):
|
|
89
84
|
|
90
85
|
|
91
86
|
@register.inclusion_tag(
|
92
|
-
|
87
|
+
"edc_subject_dashboard/buttons/forms_button.html",
|
93
88
|
takes_context=True,
|
94
89
|
)
|
95
90
|
def render_screening_part_one_button(context, subject_screening: ScreeningPartOne) -> dict:
|
@@ -102,7 +97,7 @@ def render_screening_part_one_button(context, subject_screening: ScreeningPartOn
|
|
102
97
|
|
103
98
|
|
104
99
|
@register.inclusion_tag(
|
105
|
-
|
100
|
+
"edc_subject_dashboard/buttons/forms_button.html",
|
106
101
|
takes_context=True,
|
107
102
|
)
|
108
103
|
def render_screening_part_two_button(context, subject_screening: ScreeningPartTwo) -> dict:
|
@@ -115,7 +110,7 @@ def render_screening_part_two_button(context, subject_screening: ScreeningPartTw
|
|
115
110
|
|
116
111
|
|
117
112
|
@register.inclusion_tag(
|
118
|
-
|
113
|
+
"edc_subject_dashboard/buttons/forms_button.html",
|
119
114
|
takes_context=True,
|
120
115
|
)
|
121
116
|
def render_screening_part_three_button(context, subject_screening: ScreeningPartThree) -> dict:
|
@@ -5,6 +5,7 @@ from django.core.checks import messages
|
|
5
5
|
from django.core.exceptions import ObjectDoesNotExist
|
6
6
|
from django.urls import reverse
|
7
7
|
from django.utils.html import format_html
|
8
|
+
from django.utils.safestring import mark_safe
|
8
9
|
from django.utils.translation import gettext_lazy as _
|
9
10
|
from edc_subject_dashboard.views import SubjectDashboardView
|
10
11
|
|
@@ -28,11 +29,11 @@ class DashboardView(SubjectDashboardView):
|
|
28
29
|
else:
|
29
30
|
url = reverse("meta_reports_admin:meta_reports_glucosesummary_changelist")
|
30
31
|
url = f"{url}?q={self.subject_identifier}"
|
31
|
-
message =
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
32
|
+
message = format_html(
|
33
|
+
'{text} <A href="{url}">{verbose_name}</A>',
|
34
|
+
text=_("Subject has reached the protocol endpoint. See "),
|
35
|
+
url=mark_safe(url), # nosec B703, B308
|
36
|
+
verbose_name=GlucoseSummary._meta.verbose_name,
|
36
37
|
)
|
37
38
|
self.message_user(message, level=messages.WARNING)
|
38
39
|
return context
|
meta_edc/admin.py
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
from django.contrib.admin import AdminSite as DjangoAdminSite
|
2
|
-
from edc_dashboard.utils import get_bootstrap_version
|
3
2
|
|
4
3
|
from .apps import AppConfig
|
5
4
|
|
6
5
|
|
7
6
|
class AdminSite(DjangoAdminSite):
|
8
7
|
app_index_template = "edc_model_admin/admin/app_index.html"
|
9
|
-
login_template =
|
10
|
-
logout_template =
|
8
|
+
login_template = "edc_auth/login.html"
|
9
|
+
logout_template = "edc_auth/login.html"
|
11
10
|
enable_nav_sidebar = False # DJ 3.1
|
12
11
|
final_catch_all_view = True # DJ 3.2
|
13
12
|
site_title = AppConfig.verbose_name
|
meta_edc/settings/debug.py
CHANGED
@@ -7,11 +7,11 @@ from .defaults import * # noqa
|
|
7
7
|
print(f"Settings file {__file__}")
|
8
8
|
|
9
9
|
# TZ Sites:
|
10
|
-
|
10
|
+
SITE_ID = SiteID(default=20) # Amana
|
11
11
|
# SITE_ID = SiteID(default=10) # Hindu Mandal
|
12
12
|
# SITE_ID = SiteID(default=40) # Mwananyamala
|
13
13
|
# SITE_ID = SiteID(default=50) # Mbagala
|
14
|
-
SITE_ID = SiteID(default=60) # Mnazi-Moja
|
14
|
+
# SITE_ID = SiteID(default=60) # Mnazi-Moja
|
15
15
|
# SITE_ID = SiteID(default=30) # Temeke
|
16
16
|
INDEX_PAGE = "http://localhost:8000"
|
17
17
|
EDC_SITES_UAT_DOMAIN = False
|
meta_edc/settings/defaults.py
CHANGED
@@ -19,7 +19,6 @@ env = environ.Env(
|
|
19
19
|
DJANGO_AUTO_CREATE_KEYS=(bool, False),
|
20
20
|
DJANGO_CSRF_COOKIE_SECURE=(bool, True),
|
21
21
|
DJANGO_DEBUG=(bool, False),
|
22
|
-
DJANGO_EDC_BOOTSTRAP=(int, 3),
|
23
22
|
DJANGO_EMAIL_ENABLED=(bool, False),
|
24
23
|
DJANGO_EMAIL_USE_TLS=(bool, True),
|
25
24
|
DJANGO_LIVE_SYSTEM=(bool, False),
|
@@ -375,7 +374,6 @@ EDC_DASHBOARD_APP_LABEL = "meta_dashboard"
|
|
375
374
|
EDC_NAVBAR_DEFAULT = env("EDC_NAVBAR_DEFAULT")
|
376
375
|
|
377
376
|
# dashboards
|
378
|
-
EDC_BOOTSTRAP = env("DJANGO_EDC_BOOTSTRAP")
|
379
377
|
DASHBOARD_URL_NAMES = env.dict("DJANGO_DASHBOARD_URL_NAMES")
|
380
378
|
DASHBOARD_BASE_TEMPLATES = env.dict("DJANGO_DASHBOARD_BASE_TEMPLATES")
|
381
379
|
LAB_DASHBOARD_BASE_TEMPLATES = env.dict("DJANGO_LAB_DASHBOARD_BASE_TEMPLATES")
|
@@ -446,7 +444,7 @@ MULTISITE_REGISTER_POST_MIGRATE_SYNC_ALIAS = False
|
|
446
444
|
# and that redis server is running
|
447
445
|
DEFENDER_REDIS_NAME = "default"
|
448
446
|
DEFENDER_LOCK_OUT_BY_IP_AND_USERNAME = True
|
449
|
-
DEFENDER_LOCKOUT_TEMPLATE = "edc_auth/
|
447
|
+
DEFENDER_LOCKOUT_TEMPLATE = "edc_auth/login.html"
|
450
448
|
DEFENDER_LOGIN_FAILURE_LIMIT = 5
|
451
449
|
|
452
450
|
# edc_crf
|
@@ -1,2 +1,2 @@
|
|
1
|
-
{% extends 'edc_dashboard/
|
1
|
+
{% extends 'edc_dashboard/base.html' %}
|
2
2
|
{% block footer %}{{ block.super }} {% comment %}META 2/3 base.html template{% endcomment %}{% endblock footer %}
|
meta_edc/views/home_view.py
CHANGED
@@ -2,7 +2,6 @@ from typing import Any
|
|
2
2
|
|
3
3
|
from django.conf import settings
|
4
4
|
from django.views.generic import TemplateView
|
5
|
-
from edc_dashboard.utils import get_bootstrap_version
|
6
5
|
from edc_dashboard.view_mixins import EdcViewMixin
|
7
6
|
from edc_navbar import NavbarViewMixin
|
8
7
|
from edc_randomization.site_randomizers import site_randomizers
|
@@ -11,7 +10,7 @@ from meta_edc.meta_version import get_meta_version
|
|
11
10
|
|
12
11
|
|
13
12
|
class HomeView(EdcViewMixin, NavbarViewMixin, TemplateView):
|
14
|
-
template_name =
|
13
|
+
template_name = "meta_edc/home.html"
|
15
14
|
navbar_name = settings.APP_NAME
|
16
15
|
navbar_selected_item = "home"
|
17
16
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: meta-edc
|
3
|
-
Version: 0.
|
3
|
+
Version: 1.0.1
|
4
4
|
Summary: META Trial EDC (http://www.isrctn.com/ISRCTN76157257)
|
5
5
|
Home-page: https://github.com/meta-trial/meta-edc
|
6
6
|
Author: Erik van Widenfelt
|
@@ -693,7 +693,7 @@ Requires-Python: >=3.12
|
|
693
693
|
Description-Content-Type: text/x-rst
|
694
694
|
License-File: LICENSE
|
695
695
|
License-File: AUTHORS
|
696
|
-
Requires-Dist: edc==0.
|
696
|
+
Requires-Dist: edc==1.0.0
|
697
697
|
Requires-Dist: edc-microscopy
|
698
698
|
Requires-Dist: beautifulsoup4
|
699
699
|
Requires-Dist: celery[redis]
|