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: