diff --git a/generic/migrations/0020_ciduser_supervisor_email.py b/generic/migrations/0020_ciduser_supervisor_email.py
new file mode 100644
index 00000000..72a9bc5e
--- /dev/null
+++ b/generic/migrations/0020_ciduser_supervisor_email.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.2.8 on 2021-12-14 19:15
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('generic', '0019_cidusergroup_archive'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='ciduser',
+ name='supervisor_email',
+ field=models.EmailField(blank=True, max_length=254),
+ ),
+ ]
diff --git a/generic/models.py b/generic/models.py
index 337cb499..a8906bfa 100644
--- a/generic/models.py
+++ b/generic/models.py
@@ -11,6 +11,8 @@ from django.conf import settings
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
+from django.core.mail import send_mail
+
class Plane(models.Model):
plane = models.CharField(max_length=200)
@@ -216,6 +218,20 @@ class CidUser(models.Model):
def check_passcode(self, passcode) -> bool:
return self.passcode == passcode
+ def email_details(self):
+ msg = f"""
+ Candidate details for upcomming event {self.group}
+ ---------
+ CID: {self.cid}
+ Passcode: {self.passcode}
+
+
+
+ Please note this inbox is not monitored. Direct all enquiries to ...
+ """
+
+ send_mail("Candidate Details", msg, "test@xkjq.uk", [self.email])
+
class CidUserExam(models.Model):
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
diff --git a/generic/templates/generic/author_list.html b/generic/templates/generic/author_list.html
new file mode 100755
index 00000000..51abef5d
--- /dev/null
+++ b/generic/templates/generic/author_list.html
@@ -0,0 +1,8 @@
+{% extends 'generic/base.html' %}
+
+{% block content %}
+
+{% for group in groups %}
+
Group: {{author.name}} [Email candidate details]
+{% endfor %}
+{% endblock %}
\ No newline at end of file
diff --git a/generic/templates/generic/base.html b/generic/templates/generic/base.html
new file mode 100755
index 00000000..550e2ab1
--- /dev/null
+++ b/generic/templates/generic/base.html
@@ -0,0 +1,23 @@
+{% extends 'base.html' %}
+
+{% block title %}
+CIDs
+{% endblock %}
+
+{% block css %}
+{% endblock %}
+
+{% block js %}
+{% endblock %}
+
+
+
+{% block content %}
+{% endblock %}
+{% block navigation %}
+CIDs:
+{% if request.user.is_authenticated %}
+Cids /
+Groups /
+{% endif %}
+{% endblock %}
\ No newline at end of file
diff --git a/generic/urls.py b/generic/urls.py
index 6f691d36..e7cbce22 100755
--- a/generic/urls.py
+++ b/generic/urls.py
@@ -27,5 +27,6 @@ urlpatterns = [
name="examination-autocomplete",
),
path("cids/manage/", views.CidUserView.as_view(), name="manage_cids"),
+ path("cids/group/", views.group_view, name="group_view"),
path("cids/create", views.manage_cid_users, name="manage_cid_users"),
]
diff --git a/generic/views.py b/generic/views.py
index 8219db81..f9b72e52 100644
--- a/generic/views.py
+++ b/generic/views.py
@@ -988,6 +988,16 @@ class CidUserView(LoginRequiredMixin, SingleTableMixin, FilterView):
context["cid_user_groups"] = cid_user_groups
return context
+@login_required
+@user_is_cid_user_manager
+def group_view(request):
+ groups = CidUserGroup.objects.filter(archive=False)
+
+ return render(
+ request,
+ "generic/group_view.html",
+ {"groups": groups},
+ )
@login_required
@user_is_cid_user_manager
diff --git a/rad/settings.py b/rad/settings.py
index b9598802..65312c66 100644
--- a/rad/settings.py
+++ b/rad/settings.py
@@ -19,25 +19,31 @@ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
-with open('/etc/secret_key') as f:
+with open("/etc/secret_key") as f:
SECRET_KEY = f.read().strip()
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
-ALLOWED_HOSTS = ["localhost", "127.0.0.1", "161.35.163.87", "penracourses.org.uk", "www.penracourses.org.uk"]
+ALLOWED_HOSTS = [
+ "localhost",
+ "127.0.0.1",
+ "161.35.163.87",
+ "penracourses.org.uk",
+ "www.penracourses.org.uk",
+]
# Application definition
INSTALLED_APPS = [
- 'generic',
- 'anatomy',
- 'physics',
- 'rapids',
- 'longs',
- 'sbas',
- 'wally',
- 'atlas',
+ "generic",
+ "anatomy",
+ "physics",
+ "rapids",
+ "longs",
+ "sbas",
+ "wally",
+ "atlas",
"reversion",
"django_tables2",
"django_filters",
@@ -48,13 +54,13 @@ INSTALLED_APPS = [
"dal",
"dal_select2",
"dal_queryset_sequence",
- 'django.contrib.admin',
- 'django.contrib.auth',
- 'django.contrib.contenttypes',
- 'django.contrib.sessions',
- 'django.contrib.messages',
- 'django.contrib.staticfiles',
- 'debug_toolbar',
+ "django.contrib.admin",
+ "django.contrib.auth",
+ "django.contrib.contenttypes",
+ "django.contrib.sessions",
+ "django.contrib.messages",
+ "django.contrib.staticfiles",
+ "debug_toolbar",
"tagulous",
"dbbackup",
"rest_framework",
@@ -71,10 +77,10 @@ MIDDLEWARE = [
"django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware",
"reversion.middleware.RevisionMiddleware",
- 'debug_toolbar.middleware.DebugToolbarMiddleware',
+ "debug_toolbar.middleware.DebugToolbarMiddleware",
]
-ROOT_URLCONF = 'rad.urls'
+ROOT_URLCONF = "rad.urls"
TEMPLATES = [
{
@@ -93,18 +99,18 @@ TEMPLATES = [
},
]
-WSGI_APPLICATION = 'rad.wsgi.application'
+WSGI_APPLICATION = "rad.wsgi.application"
# Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases
DATABASES = {
- 'default': {
+ "default": {
"ENGINE": "django.db.backends.postgresql",
"NAME": "rad",
"USER": "django",
"PASSWORD": "f7bf31dc9bda1256ea827953480d1917",
- #"HOST": "xkjq.uk",
+ # "HOST": "xkjq.uk",
"HOST": "161.35.163.87",
"PORT": "5432",
}
@@ -115,20 +121,16 @@ DATABASES = {
AUTH_PASSWORD_VALIDATORS = [
{
- 'NAME':
- 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
+ "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator",
},
{
- 'NAME':
- 'django.contrib.auth.password_validation.MinimumLengthValidator',
+ "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",
},
{
- 'NAME':
- 'django.contrib.auth.password_validation.CommonPasswordValidator',
+ "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator",
},
{
- 'NAME':
- 'django.contrib.auth.password_validation.NumericPasswordValidator',
+ "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",
},
]
@@ -142,9 +144,9 @@ SERIALIZATION_MODULES = {
# Internationalization
# https://docs.djangoproject.com/en/1.11/topics/i18n/
-LANGUAGE_CODE = 'en-us'
+LANGUAGE_CODE = "en-us"
-TIME_ZONE = 'Europe/London'
+TIME_ZONE = "Europe/London"
USE_I18N = True
@@ -156,20 +158,20 @@ USE_TZ = True
# https://docs.djangoproject.com/en/1.11/howto/static-files/
SECURE_SSL_REDIRECT = True
-SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
+SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")
-STATIC_URL = '/static/'
-STATIC_ROOT = 'static/'
+STATIC_URL = "/static/"
+STATIC_ROOT = "static/"
REMOTE_URL = "https://www.penracourses.org.uk"
#
-#if DEBUG:
+# if DEBUG:
# STATIC_URL = REMOTE_URL + STATIC_URL
-MEDIA_URL = '/media/'
-MEDIA_ROOT = '/home/django/rad/media/'
+MEDIA_URL = "/media/"
+MEDIA_ROOT = "/home/django/rad/media/"
-#if DEBUG:
+# if DEBUG:
# MEDIA_URL = REMOTE_URL + MEDIA_URL
# Redirect to home URL after login (Default redirects to /accounts/profile/)
@@ -177,10 +179,10 @@ LOGIN_REDIRECT_URL = "/"
LOGOUT_REDIRECT_URL = "/"
TAGULOUS_AUTOCOMPLETE_JS = (
-"tagulous/lib/jquery.js",
-"tagulous/lib/select2-3/select2.min.js",
-"tagulous/tagulous.js",
-"tagulous/adaptor/select2-3.js",
+ "tagulous/lib/jquery.js",
+ "tagulous/lib/select2-3/select2.min.js",
+ "tagulous/tagulous.js",
+ "tagulous/adaptor/select2-3.js",
)
TAGULOUS_AUTOCOMPLETE_CSS = {"all": ["tagulous/lib/select2-3/select2.css"]}
@@ -199,33 +201,38 @@ LOGGING = {
CORS_ORIGIN_ALLOW_ALL = True
CACHES = {
- 'default': {
- 'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache',
- 'LOCATION': '127.0.0.1:11211',
+ "default": {
+ "BACKEND": "django.core.cache.backends.memcached.PyMemcacheCache",
+ "LOCATION": "127.0.0.1:11211",
#'OPTIONS': {
# 'server_max_value_length': 1024 * 1024 * 10
- #}
+ # }
+ },
+ "filesystem": {
+ "BACKEND": "django.core.cache.backends.filebased.FileBasedCache",
+ "LOCATION": "/var/tmp/django_cache",
},
- 'filesystem': {
- 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
- 'LOCATION': '/var/tmp/django_cache',
- }
}
THUMBNAIL_ALIASES = {
- '': {
- 'exam-list': {'size': (50, 50), 'crop': True},
+ "": {
+ "exam-list": {"size": (50, 50), "crop": True},
},
}
DATA_UPLOAD_MAX_NUMBER_FIELDS = 50000
-THUMBNAIL_SOURCE_GENERATORS = ('easy_thumbnails.source_generators.pil_image', 'helpers.images.pil_dicom_image')
-DBBACKUP_STORAGE = 'django.core.files.storage.FileSystemStorage'
-DBBACKUP_STORAGE_OPTIONS = {'location': os.path.join(BASE_DIR, '../backups')}
+THUMBNAIL_SOURCE_GENERATORS = (
+ "easy_thumbnails.source_generators.pil_image",
+ "helpers.images.pil_dicom_image",
+)
+DBBACKUP_STORAGE = "django.core.files.storage.FileSystemStorage"
+DBBACKUP_STORAGE_OPTIONS = {"location": os.path.join(BASE_DIR, "../backups")}
-DEFAULT_FILE_STORAGE = 'django_hashedfilenamestorage.storage.HashedFilenameFileSystemStorage'
+DEFAULT_FILE_STORAGE = (
+ "django_hashedfilenamestorage.storage.HashedFilenameFileSystemStorage"
+)
TINYMCE_DEFAULT_CONFIG = {
"theme": "silver",
@@ -238,21 +245,21 @@ TINYMCE_DEFAULT_CONFIG = {
"bold italic backcolor | alignleft aligncenter "
"alignright alignjustify | bullist numlist outdent indent | "
"removeformat | code | help",
- "skin": 'oxide-dark',
- "menubar": 'tools',
- "content_css": 'dark',
+ "skin": "oxide-dark",
+ "menubar": "tools",
+ "content_css": "dark",
}
-DEFAULT_AUTO_FIELD='django.db.models.AutoField'
+DEFAULT_AUTO_FIELD = "django.db.models.AutoField"
-EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
+EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
-EMAIL_HOST = 'mail.xkjq.uk'
-EMAIL_HOST_USER = 'test@xkjq.uk'
-EMAIL_HOST_PASSWORD = 'b=GzK~4$oRVE'
-EMAIL_PORT = 465
-EMAIL_USE_TLS = True
-EMAIL_USE_SSl = True
+EMAIL_HOST = "mail.xkjq.uk"
+EMAIL_HOST_USER = "test@xkjq.uk"
+EMAIL_HOST_PASSWORD = "b=GzK~4$oRVE"
+EMAIL_PORT = 587
+EMAIL_USE_TLS = False
+EMAIL_USE_SSl = False
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
try: