Make the webinterface ready for 2022 #1
			
				
			
		
		
		
	| 
						 | 
				
			
			@ -0,0 +1,7 @@
 | 
			
		|||
from .models import Contest
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def current_contest(self):
 | 
			
		||||
    return {
 | 
			
		||||
        'current_contest': Contest.get_current_contest(),
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,20 @@
 | 
			
		|||
# Generated by Django 4.0.1 on 2022-01-22 17:52
 | 
			
		||||
 | 
			
		||||
import django.core.validators
 | 
			
		||||
from django.db import migrations, models
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Migration(migrations.Migration):
 | 
			
		||||
 | 
			
		||||
    dependencies = [
 | 
			
		||||
        ('contest', '0021_alter_qso_otherno_alter_qso_ownno_alter_user_dncall_and_more'),
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    operations = [
 | 
			
		||||
        migrations.AddField(
 | 
			
		||||
            model_name='contest',
 | 
			
		||||
            name='contestNo',
 | 
			
		||||
            field=models.IntegerField(default=1, help_text='Running number of contest (for vanity reasons)', validators=[django.core.validators.MinValueValidator(1)]),
 | 
			
		||||
            preserve_default=False,
 | 
			
		||||
        ),
 | 
			
		||||
    ]
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,19 @@
 | 
			
		|||
# Generated by Django 4.0.1 on 2022-01-22 17:56
 | 
			
		||||
 | 
			
		||||
from django.db import migrations, models
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Migration(migrations.Migration):
 | 
			
		||||
 | 
			
		||||
    dependencies = [
 | 
			
		||||
        ('contest', '0022_contest_contestno'),
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    operations = [
 | 
			
		||||
        migrations.AddField(
 | 
			
		||||
            model_name='contest',
 | 
			
		||||
            name='rulesetLink',
 | 
			
		||||
            field=models.TextField(default='', help_text='URL to the ruleset pdf for this contest'),
 | 
			
		||||
            preserve_default=False,
 | 
			
		||||
        ),
 | 
			
		||||
    ]
 | 
			
		||||
| 
						 | 
				
			
			@ -12,6 +12,9 @@ from .validators import CallUsernameValidator
 | 
			
		|||
class Contest(models.Model):
 | 
			
		||||
    name = models.CharField(max_length=20)
 | 
			
		||||
    shortName = models.CharField(max_length=20, unique=True)
 | 
			
		||||
    contestNo = models.IntegerField(validators=[MinValueValidator(1)],
 | 
			
		||||
                                    help_text="Running number of contest (for vanity reasons)")
 | 
			
		||||
    rulesetLink = models.TextField(help_text="URL to the ruleset pdf for this contest")
 | 
			
		||||
    callQrg = models.ForeignKey("Frequency", on_delete=models.SET_NULL, null=True, blank=True)
 | 
			
		||||
    deadline = models.DateTimeField()
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -23,7 +26,12 @@ class Contest(models.Model):
 | 
			
		|||
 | 
			
		||||
    @classmethod
 | 
			
		||||
    def get_current_contest(cls):
 | 
			
		||||
        return cls.objects.get(id=1)
 | 
			
		||||
        # Currently the contest with the latest deadline is the active one
 | 
			
		||||
        # This definitely has potential for improvement, but it's better than a hardcoded contest
 | 
			
		||||
        contests = cls.objects.order_by("-deadline")
 | 
			
		||||
        if len(contests) > 0:
 | 
			
		||||
            return contests[0]
 | 
			
		||||
        return None
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Reference(models.Model):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -40,6 +40,7 @@ INSTALLED_APPS = [
 | 
			
		|||
    'django.contrib.sessions',
 | 
			
		||||
    'django.contrib.messages',
 | 
			
		||||
    'django.contrib.staticfiles',
 | 
			
		||||
    'django.contrib.humanize',
 | 
			
		||||
    'crispy_forms',
 | 
			
		||||
    'rest_framework',
 | 
			
		||||
    'django_filters',
 | 
			
		||||
| 
						 | 
				
			
			@ -72,6 +73,7 @@ TEMPLATES = [
 | 
			
		|||
                'django.template.context_processors.request',
 | 
			
		||||
                'django.contrib.auth.context_processors.auth',
 | 
			
		||||
                'django.contrib.messages.context_processors.messages',
 | 
			
		||||
                'contest.context_processors.current_contest',
 | 
			
		||||
            ],
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,7 +7,7 @@ from contest.views import index, register, profile
 | 
			
		|||
 | 
			
		||||
urlpatterns = [
 | 
			
		||||
    path('', index, name="index"),
 | 
			
		||||
    path('cqtufm2019/', include('contest.urls', namespace='contest')),
 | 
			
		||||
    path('contest/', include('contest.urls', namespace='contest')),
 | 
			
		||||
 | 
			
		||||
    path('admin/', admin.site.urls),
 | 
			
		||||
    path('login/', auth_views.LoginView.as_view(), name='login'),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,7 +10,7 @@
 | 
			
		|||
    <link rel="icon" href="/favicon.ico">
 | 
			
		||||
	{% load static %}
 | 
			
		||||
 | 
			
		||||
    <title>CQTUFM2019 - CQ TU FM Contest 2019</title>
 | 
			
		||||
    <title>{{ current_contest.name }}</title>
 | 
			
		||||
 | 
			
		||||
    <!-- Bootstrap core CSS -->
 | 
			
		||||
    <link href="{% static "css/bootstrap.min.css" %}" rel="stylesheet">
 | 
			
		||||
| 
						 | 
				
			
			@ -35,7 +35,7 @@
 | 
			
		|||
            <span class="icon-bar"></span>
 | 
			
		||||
            <span class="icon-bar"></span>
 | 
			
		||||
          </button>
 | 
			
		||||
          <a class="navbar-brand" href="{% url "index" %}">CQ TU FM 2019</a>
 | 
			
		||||
          <a class="navbar-brand" href="{% url "index" %}">{{ current_contest.name | default:"NO CONTEST" }}</a>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div id="navbar" class="navbar-collapse collapse">
 | 
			
		||||
          <ul class="nav navbar-nav">
 | 
			
		||||
| 
						 | 
				
			
			@ -88,7 +88,7 @@
 | 
			
		|||
 | 
			
		||||
    <footer class="footer">
 | 
			
		||||
      <div class="container">
 | 
			
		||||
        <p class="text-muted">CQ TU FM 2019, a <a href="http://dk0tu.de/">DK0TU</a> product</p>
 | 
			
		||||
        <p class="text-muted">{{ current_contest.name }}, a <a href="http://dk0tu.de/">DK0TU</a> product</p>
 | 
			
		||||
      </div>
 | 
			
		||||
    </footer>
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,7 +4,7 @@
 | 
			
		|||
		<p>
 | 
			
		||||
		Welcome to {{ contest.name }}!
 | 
			
		||||
		<p/>
 | 
			
		||||
		<p>Here you can find a short overview over the rules, but note that this is not a replacement for the <a href="http://dk0tu.de/contests/cqtu/CQTU_2017-02-02_FM_Rules+Log.300dpi.pdf">complete ruleset</a>.</p>
 | 
			
		||||
		<p>Here you can find a short overview over the rules, but note that this is not a replacement for the <a href="{{ current_contest.rulesetLink }}">complete ruleset</a>.</p>
 | 
			
		||||
		<p>
 | 
			
		||||
			<ul>
 | 
			
		||||
				<li>Change frequency after a successful CQ-call! If you answered, feel free to call CQ on this frequency.</li>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,12 +1,17 @@
 | 
			
		|||
{% extends "base.html" %}
 | 
			
		||||
 | 
			
		||||
{% load crispy_forms_tags %}
 | 
			
		||||
{% load humanize %}
 | 
			
		||||
 | 
			
		||||
{% block content %}
 | 
			
		||||
 | 
			
		||||
<div class="row">
 | 
			
		||||
	<div class="col-sm-12">
 | 
			
		||||
		<p class="lead">Hello and welcome to the 4th DK0TU CQ TU contest, the CQ TU 2019!</p>
 | 
			
		||||
		{% if current_contest %}
 | 
			
		||||
			<p class="lead">Hello and welcome to the {{ current_contest.contestNo | ordinal }} DK0TU CQ TU contest, the {{ current_contest.name }}!</p>
 | 
			
		||||
		{% else %}
 | 
			
		||||
			<p class="lead">ERROR: No contest set in admin area! If you're an admin <a href="/admin/">go create one</a>.</p>
 | 
			
		||||
		{% endif %}
 | 
			
		||||
	</div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue