diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..eca2a89b04a3e380907aa885e8b227e4611cec55 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +__pycache__/ +.env +webpack-stats.json +staticfiles +node_modules diff --git a/groups/__init__.py b/groups/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/groups/admin.py b/groups/admin.py new file mode 100644 index 0000000000000000000000000000000000000000..8c38f3f3dad51e4585f3984282c2a4bec5349c1e --- /dev/null +++ b/groups/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/groups/apps.py b/groups/apps.py new file mode 100644 index 0000000000000000000000000000000000000000..86b49bc69390200e161abca3346269d60c54b2f0 --- /dev/null +++ b/groups/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class GroupsConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'groups' diff --git a/groups/migrations/__init__.py b/groups/migrations/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/groups/models.py b/groups/models.py new file mode 100644 index 0000000000000000000000000000000000000000..fbab9a6d5e8e818050b04cbb5410e1200dc8b29e --- /dev/null +++ b/groups/models.py @@ -0,0 +1,21 @@ +from django.db import models + +# Create your models here. + + +class Group(models.Model): + name = models.CharField( + max_length=128, + verbose_name="Jméno", + ) + + lectures = models.ManyToManyField( + "lectures.Lecture", + blank=True, + null=True, + verbose_name="Události", + ) + + class Meta: + verbose_name = "Skupina" + verbose_name_plural = "Skupiny" diff --git a/groups/tests.py b/groups/tests.py new file mode 100644 index 0000000000000000000000000000000000000000..7ce503c2dd97ba78597f6ff6e4393132753573f6 --- /dev/null +++ b/groups/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/groups/views.py b/groups/views.py new file mode 100644 index 0000000000000000000000000000000000000000..91ea44a218fbd2f408430959283f0419c921093e --- /dev/null +++ b/groups/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/lectures/__init__.py b/lectures/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/lectures/admin.py b/lectures/admin.py new file mode 100644 index 0000000000000000000000000000000000000000..8c38f3f3dad51e4585f3984282c2a4bec5349c1e --- /dev/null +++ b/lectures/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/lectures/apps.py b/lectures/apps.py new file mode 100644 index 0000000000000000000000000000000000000000..30d62f2847985f5046f071af0616c7d1202ac5cd --- /dev/null +++ b/lectures/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class LecturesConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'lectures' diff --git a/lectures/migrations/0001_initial.py b/lectures/migrations/0001_initial.py new file mode 100644 index 0000000000000000000000000000000000000000..549de6b5571b77807fd889b3f0a7027e4ec043b7 --- /dev/null +++ b/lectures/migrations/0001_initial.py @@ -0,0 +1,70 @@ +# Generated by Django 4.1.4 on 2023-04-17 10:56 + +from django.db import migrations, models +import django.db.models.deletion +import markdownx.models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Lecture', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('timestamp', models.DateTimeField(blank=True, null=True, verbose_name='Datum a čas konání')), + ('type', models.CharField(choices=[('recommended', 'Doporučené'), ('optional', 'Volitelné')], max_length=11, verbose_name='Typ')), + ('name', models.CharField(max_length=128, verbose_name='Název')), + ('description', markdownx.models.MarkdownxField(blank=True, help_text='Můžeš použít markdown.', null=True, verbose_name='Popis')), + ], + options={ + 'verbose_name': 'Lekce', + 'verbose_name_plural': 'Lekce', + }, + ), + migrations.CreateModel( + name='Material', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=128, verbose_name='Název')), + ('link', models.URLField(blank=True, max_length=256, null=True, verbose_name='Odkaz')), + ('file', models.FileField(blank=True, null=True, upload_to='', verbose_name='Soubor')), + ('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='materials', to='lectures.lecture', verbose_name='Událost')), + ], + options={ + 'verbose_name': 'Materiál', + 'verbose_name_plural': 'Materiály', + }, + ), + migrations.CreateModel( + name='LectureRecording', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=128, verbose_name='Název')), + ('link', models.URLField(blank=True, max_length=256, null=True, verbose_name='Odkaz')), + ('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='recordings', to='lectures.lecture', verbose_name='Událost')), + ], + options={ + 'verbose_name': 'Nahrávka', + 'verbose_name_plural': 'Nahrávky', + }, + ), + migrations.CreateModel( + name='LectureLector', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=128, verbose_name='Jméno')), + ('link', models.URLField(blank=True, max_length=256, null=True, verbose_name='Odkaz')), + ('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='lectors', to='lectures.lecture', verbose_name='Událost')), + ], + options={ + 'verbose_name': 'Lektor', + 'verbose_name_plural': 'Lektoři', + }, + ), + ] diff --git a/lectures/migrations/__init__.py b/lectures/migrations/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/lectures/models.py b/lectures/models.py new file mode 100644 index 0000000000000000000000000000000000000000..81cd2a0163c90d9003b3dbf75ae51760fccff4e3 --- /dev/null +++ b/lectures/models.py @@ -0,0 +1,140 @@ +from datetime import timedelta + +from django.core.exceptions import ValidationError +from django.db import models +from django.utils import timezone +from markdownx.models import MarkdownxField + +# Create your models here. + + +class Lecture(models.Model): + timestamp = models.DateTimeField( + verbose_name="Datum a čas konání", + blank=True, + null=True, + ) # If undefined, assume this event was in the past + + class TypeChoices(models.TextChoices): + RECOMMENDED = "recommended", "Doporučené" + OPTIONAL = "optional", "Volitelné" + + type = models.CharField( + choices=TypeChoices.choices, + max_length=11, + verbose_name="Typ", + ) + + name = models.CharField( + max_length=128, + verbose_name="Název", + ) + + description = MarkdownxField( + blank=True, + null=True, + verbose_name="Popis", + help_text="Můžeš použít markdown.", + ) + + @property + def is_current(self) -> bool: + # On or after the current time, minus 8 hours + return self.timestamp >= (timezone.now() - timedelta(hours=8)) + + class Meta: + verbose_name = "Lekce" + verbose_name_plural = verbose_name + + +class LectureLector(models.Model): + event = models.ForeignKey( + "Lecture", + on_delete=models.CASCADE, + related_name="lectors", + verbose_name="Událost", + ) + + name = models.CharField( + max_length=128, + verbose_name="Jméno", + ) + + link = models.URLField( + max_length=256, + blank=True, + null=True, + verbose_name="Odkaz", + ) + + class Meta: + verbose_name = "Lektor" + verbose_name_plural = "Lektoři" + + +class LectureRecording(models.Model): + event = models.ForeignKey( + "Lecture", + on_delete=models.CASCADE, + related_name="recordings", + verbose_name="Událost", + ) + + name = models.CharField( + max_length=128, + verbose_name="Název", + ) + + link = models.URLField( + max_length=256, + blank=True, + null=True, + verbose_name="Odkaz", + ) + + class Meta: + verbose_name = "Nahrávka" + verbose_name_plural = "Nahrávky" + + +class Material(models.Model): + event = models.ForeignKey( + "Lecture", + on_delete=models.CASCADE, + related_name="materials", + verbose_name="Událost", + ) + + name = models.CharField( + max_length=128, + verbose_name="Název", + ) + + link = models.URLField( + max_length=256, + blank=True, + null=True, + verbose_name="Odkaz", + ) + + file = models.FileField( + blank=True, + null=True, + verbose_name="Soubor", + ) + + def clean(self) -> None: + BOTH_FILE_AND_LINK_DEFINED_ERROR = ( + "Definuj prosím pouze odkaz, nebo soubor. " + "Nemůžeš mít oboje najednou." + ) + + if self.file and self.link: + raise ValidationError({ + "link": BOTH_FILE_AND_LINK_DEFINED_ERROR, + "file": BOTH_FILE_AND_LINK_DEFINED_ERROR, + }) + + class Meta: + verbose_name = "Materiál" + verbose_name_plural = "Materiály" diff --git a/lectures/tests.py b/lectures/tests.py new file mode 100644 index 0000000000000000000000000000000000000000..7ce503c2dd97ba78597f6ff6e4393132753573f6 --- /dev/null +++ b/lectures/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/lectures/views.py b/lectures/views.py new file mode 100644 index 0000000000000000000000000000000000000000..91ea44a218fbd2f408430959283f0419c921093e --- /dev/null +++ b/lectures/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/requirements/base.txt b/requirements/base.txt index cbec214fb556d41312d2fe24cd435631012f0bb9..84cb6bb3b22a1d7da346df9c6f1d5f0585777852 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -2,6 +2,7 @@ django==4.1.4 django-admin-index==2.0.2 django-admin-interface==0.24.2 django-database-url==1.0.3 +django-markdownx==4.0.0b1 django-ordered-model==3.7.1 psycopg2-binary==2.9.5 django-webpack-loader==1.8.0 diff --git a/shared/static/shared/base.js b/shared/static/shared/base.js new file mode 100644 index 0000000000000000000000000000000000000000..d52da305ca4c673c848f91497ca84cbb9df9970f --- /dev/null +++ b/shared/static/shared/base.js @@ -0,0 +1 @@ +(self.webpackChunkucebnice=self.webpackChunkucebnice||[]).push([[348],{208:()=>{}},e=>{e(e.s=208)}]); \ No newline at end of file diff --git a/shared/static/shared/runtime.js b/shared/static/shared/runtime.js new file mode 100644 index 0000000000000000000000000000000000000000..52a82802fa3960a8c24b6bf124d26ab5b5de92dc --- /dev/null +++ b/shared/static/shared/runtime.js @@ -0,0 +1 @@ +(()=>{"use strict";var r,e={},n={};function o(r){var t=n[r];if(void 0!==t)return t.exports;var i=n[r]={exports:{}};return e[r](i,i.exports,o),i.exports}o.m=e,r=[],o.O=(e,n,t,i)=>{if(!n){var a=1/0;for(l=0;l<r.length;l++){for(var[n,t,i]=r[l],s=!0,c=0;c<n.length;c++)(!1&i||a>=i)&&Object.keys(o.O).every((r=>o.O[r](n[c])))?n.splice(c--,1):(s=!1,i<a&&(a=i));if(s){r.splice(l--,1);var f=t();void 0!==f&&(e=f)}}return e}i=i||0;for(var l=r.length;l>0&&r[l-1][2]>i;l--)r[l]=r[l-1];r[l]=[n,t,i]},o.o=(r,e)=>Object.prototype.hasOwnProperty.call(r,e),(()=>{var r={666:0};o.O.j=e=>0===r[e];var e=(e,n)=>{var t,i,[a,s,c]=n,f=0;if(a.some((e=>0!==r[e]))){for(t in s)o.o(s,t)&&(o.m[t]=s[t]);if(c)var l=c(o)}for(e&&e(n);f<a.length;f++)i=a[f],o.o(r,i)&&r[i]&&r[i][0](),r[i]=0;return o.O(l)},n=self.webpackChunkucebnice=self.webpackChunkucebnice||[];n.forEach(e.bind(null,0)),n.push=e.bind(null,n.push.bind(n))})()})(); \ No newline at end of file diff --git a/shared/static/shared/style.css b/shared/static/shared/style.css new file mode 100644 index 0000000000000000000000000000000000000000..7958c7a8505e637ccdcbcb34981615e160c303a0 --- /dev/null +++ b/shared/static/shared/style.css @@ -0,0 +1,541 @@ +/* +! tailwindcss v3.3.1 | MIT License | https://tailwindcss.com +*/ + +/* +1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) +2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) +*/ + +*, +::before, +::after { + box-sizing: border-box; + /* 1 */ + border-width: 0; + /* 2 */ + border-style: solid; + /* 2 */ + border-color: #e5e7eb; + /* 2 */ +} + +::before, +::after { + --tw-content: ''; +} + +/* +1. Use a consistent sensible line-height in all browsers. +2. Prevent adjustments of font size after orientation changes in iOS. +3. Use a more readable tab size. +4. Use the user's configured `sans` font-family by default. +5. Use the user's configured `sans` font-feature-settings by default. +6. Use the user's configured `sans` font-variation-settings by default. +*/ + +html { + line-height: 1.5; + /* 1 */ + -webkit-text-size-adjust: 100%; + /* 2 */ + -moz-tab-size: 4; + /* 3 */ + -o-tab-size: 4; + tab-size: 4; + /* 3 */ + font-family: Roboto Condensed, ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"; + /* 4 */ + font-feature-settings: normal; + /* 5 */ + font-variation-settings: normal; + /* 6 */ +} + +/* +1. Remove the margin in all browsers. +2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. +*/ + +body { + margin: 0; + /* 1 */ + line-height: inherit; + /* 2 */ +} + +/* +1. Add the correct height in Firefox. +2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) +3. Ensure horizontal rules are visible by default. +*/ + +hr { + height: 0; + /* 1 */ + color: inherit; + /* 2 */ + border-top-width: 1px; + /* 3 */ +} + +/* +Add the correct text decoration in Chrome, Edge, and Safari. +*/ + +abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} + +/* +Remove the default font size and weight for headings. +*/ + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: inherit; + font-weight: inherit; +} + +/* +Reset links to optimize for opt-in styling instead of opt-out. +*/ + +a { + color: inherit; + text-decoration: inherit; +} + +/* +Add the correct font weight in Edge and Safari. +*/ + +b, +strong { + font-weight: bolder; +} + +/* +1. Use the user's configured `mono` font family by default. +2. Correct the odd `em` font sizing in all browsers. +*/ + +code, +kbd, +samp, +pre { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + /* 1 */ + font-size: 1em; + /* 2 */ +} + +/* +Add the correct font size in all browsers. +*/ + +small { + font-size: 80%; +} + +/* +Prevent `sub` and `sup` elements from affecting the line height in all browsers. +*/ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* +1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) +2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) +3. Remove gaps between table borders by default. +*/ + +table { + text-indent: 0; + /* 1 */ + border-color: inherit; + /* 2 */ + border-collapse: collapse; + /* 3 */ +} + +/* +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +3. Remove default padding in all browsers. +*/ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + /* 1 */ + font-size: 100%; + /* 1 */ + font-weight: inherit; + /* 1 */ + line-height: inherit; + /* 1 */ + color: inherit; + /* 1 */ + margin: 0; + /* 2 */ + padding: 0; + /* 3 */ +} + +/* +Remove the inheritance of text transform in Edge and Firefox. +*/ + +button, +select { + text-transform: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Remove default button styles. +*/ + +button, +[type='button'], +[type='reset'], +[type='submit'] { + -webkit-appearance: button; + /* 1 */ + background-color: transparent; + /* 2 */ + background-image: none; + /* 2 */ +} + +/* +Use the modern Firefox focus style for all focusable elements. +*/ + +:-moz-focusring { + outline: auto; +} + +/* +Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) +*/ + +:-moz-ui-invalid { + box-shadow: none; +} + +/* +Add the correct vertical alignment in Chrome and Firefox. +*/ + +progress { + vertical-align: baseline; +} + +/* +Correct the cursor style of increment and decrement buttons in Safari. +*/ + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +/* +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ + +[type='search'] { + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ +} + +/* +Remove the inner padding in Chrome and Safari on macOS. +*/ + +::-webkit-search-decoration { + -webkit-appearance: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to `inherit` in Safari. +*/ + +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ +} + +/* +Add the correct display in Chrome and Safari. +*/ + +summary { + display: list-item; +} + +/* +Removes the default spacing and border for appropriate elements. +*/ + +blockquote, +dl, +dd, +h1, +h2, +h3, +h4, +h5, +h6, +hr, +figure, +p, +pre { + margin: 0; +} + +fieldset { + margin: 0; + padding: 0; +} + +legend { + padding: 0; +} + +ol, +ul, +menu { + list-style: none; + margin: 0; + padding: 0; +} + +/* +Prevent resizing textareas horizontally by default. +*/ + +textarea { + resize: vertical; +} + +/* +1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) +2. Set the default placeholder color to the user's configured gray 400 color. +*/ + +input::-moz-placeholder, textarea::-moz-placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +input::placeholder, +textarea::placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +/* +Set the default cursor for buttons. +*/ + +button, +[role="button"] { + cursor: pointer; +} + +/* +Make sure disabled buttons don't get the pointer cursor. +*/ + +:disabled { + cursor: default; +} + +/* +1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) +2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) + This can trigger a poorly considered lint error in some tools but is included by design. +*/ + +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; + /* 1 */ + vertical-align: middle; + /* 2 */ +} + +/* +Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) +*/ + +img, +video { + max-width: 100%; + height: auto; +} + +/* Make elements with the HTML hidden attribute stay hidden by default */ + +[hidden] { + display: none; +} + +html { + font-family: "Roboto Condensed", system-ui, sans-serif; +} + +*, ::before, ::after { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; +} + +::backdrop { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; +} + +.static { + position: static; +} + +.block { + display: block; +} + +.flex { + display: flex; +} + +.transition { + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} diff --git a/ucebnice/settings/base.py b/ucebnice/settings/base.py index 0715725ce6b052f7d4cd9a63d9fd56a5c2aaccd6..6c0fb6de2afb7bbac2f4e1bf0d7660fdb8e9f94b 100644 --- a/ucebnice/settings/base.py +++ b/ucebnice/settings/base.py @@ -58,6 +58,7 @@ INSTALLED_APPS = [ "shared", "oidc", "users", + "lectures", ] MIDDLEWARE = [