diff --git a/.gitignore b/.gitignore
index d37e6f6..058ad98 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,7 +11,9 @@ db.sqlite3
# Environments
.python-version
+.env
.venv
+env/
venv/
# Distribution / packaging
@@ -22,10 +24,3 @@ dist/
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
-
-# IDE stuff
-.idea/
-.vscode/
-
-# Other stuff
-_tmp
diff --git a/Makefile b/Makefile
deleted file mode 100644
index c2bda28..0000000
--- a/Makefile
+++ /dev/null
@@ -1,18 +0,0 @@
-# General settings
-APP_NAME := tofu
-PYTHON ?= python3
-
-# Development server
-SERVER_LISTEN ?= 0.0.0.0:8037
-
-.PHONY: run
-
-# Default target: none
-all:
-
-
-### Local development
-
-# Run django development server
-run:
- $(PYTHON) manage.py runserver $(SERVER_LISTEN)
diff --git a/issues/__init__.py b/issues/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/issues/admin.py b/issues/admin.py
deleted file mode 100644
index dfbf979..0000000
--- a/issues/admin.py
+++ /dev/null
@@ -1,5 +0,0 @@
-from django.contrib import admin
-
-from .models import Issue
-
-admin.site.register(Issue)
diff --git a/issues/apps.py b/issues/apps.py
deleted file mode 100644
index 73a36a0..0000000
--- a/issues/apps.py
+++ /dev/null
@@ -1,5 +0,0 @@
-from django.apps import AppConfig
-
-
-class IssuesConfig(AppConfig):
- name = 'issues'
diff --git a/issues/forms.py b/issues/forms.py
deleted file mode 100644
index c7c5dc9..0000000
--- a/issues/forms.py
+++ /dev/null
@@ -1,9 +0,0 @@
-from django.forms import ModelForm
-
-from .models import Issue
-
-
-class IssueForm(ModelForm):
- class Meta:
- model = Issue
- fields = ['project', 'title', 'text']
diff --git a/issues/migrations/0001_initial.py b/issues/migrations/0001_initial.py
deleted file mode 100644
index 82fb950..0000000
--- a/issues/migrations/0001_initial.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# Generated by Django 2.2.1 on 2019-05-27 12:56
-
-from django.db import migrations, models
-import django.db.models.deletion
-import django.utils.timezone
-
-
-class Migration(migrations.Migration):
-
- initial = True
-
- dependencies = [
- ('projects', '0001_initial'),
- ]
-
- operations = [
- migrations.CreateModel(
- name='Issue',
- fields=[
- ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('title', models.CharField(max_length=200)),
- ('text', models.TextField(blank=True)),
- ('create_date', models.DateTimeField(default=django.utils.timezone.now)),
- ('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='projects.Project')),
- ],
- ),
- ]
diff --git a/issues/migrations/__init__.py b/issues/migrations/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/issues/models.py b/issues/models.py
deleted file mode 100644
index 180923f..0000000
--- a/issues/models.py
+++ /dev/null
@@ -1,14 +0,0 @@
-from django.db import models
-from django.utils import timezone
-
-from projects.models import Project
-
-
-class Issue(models.Model):
- project = models.ForeignKey(Project, on_delete=models.CASCADE)
- title = models.CharField(max_length=200)
- text = models.TextField(blank=True)
- create_date = models.DateTimeField(default=timezone.now)
-
- def __str__(self):
- return self.title
diff --git a/issues/templates/issues/detail.html b/issues/templates/issues/detail.html
deleted file mode 100644
index e25b70d..0000000
--- a/issues/templates/issues/detail.html
+++ /dev/null
@@ -1,12 +0,0 @@
-{% extends "base.html" %}
-
-{% block title %}Issue: {{ issue.title }}{% endblock %}
-
-{% block content %}
-
#{{ issue.id }}: {{ issue.title }}
-
- Project: {{ issue.project }}
- Created: {{ issue.create_date }}
-
- {{ issue.text }}
-{% endblock %}
diff --git a/issues/templates/issues/index.html b/issues/templates/issues/index.html
deleted file mode 100644
index 9eb3e07..0000000
--- a/issues/templates/issues/index.html
+++ /dev/null
@@ -1,19 +0,0 @@
-{% extends "base.html" %}
-
-{% block title %}Issues{% endblock %}
-
-{% block content %}
- {% if issue_list %}
-
- {% else %}
- No issues.
- {% endif %}
-
- Create new issue
-{% endblock %}
diff --git a/issues/templates/issues/new.html b/issues/templates/issues/new.html
deleted file mode 100644
index 0e6d87c..0000000
--- a/issues/templates/issues/new.html
+++ /dev/null
@@ -1,21 +0,0 @@
-{% extends "base.html" %}
-
-{% block title %}Create issue{% endblock %}
-
-{% block content %}
- Create new issue
-
- {% if error_message %}{{ error_message }}
{% endif %}
-
-
-{% endblock %}
diff --git a/issues/tests.py b/issues/tests.py
deleted file mode 100644
index 7ce503c..0000000
--- a/issues/tests.py
+++ /dev/null
@@ -1,3 +0,0 @@
-from django.test import TestCase
-
-# Create your tests here.
diff --git a/issues/urls.py b/issues/urls.py
deleted file mode 100644
index 8402305..0000000
--- a/issues/urls.py
+++ /dev/null
@@ -1,10 +0,0 @@
-from django.urls import path
-
-from . import views
-
-app_name = 'issues'
-urlpatterns = [
- path('', views.IndexView.as_view(), name='index'),
- path('new', views.new, name='new'),
- path('/', views.DetailView.as_view(), name='detail'),
-]
diff --git a/issues/views.py b/issues/views.py
deleted file mode 100644
index a41005d..0000000
--- a/issues/views.py
+++ /dev/null
@@ -1,42 +0,0 @@
-from django.contrib.auth.decorators import login_required
-from django.contrib.auth.mixins import LoginRequiredMixin
-from django.http import HttpResponseRedirect
-from django.shortcuts import render
-from django.views import generic
-
-from .forms import IssueForm
-from .models import Issue
-
-
-class IndexView(LoginRequiredMixin, generic.ListView):
- template_name = 'issues/index.html'
- context_object_name = 'issue_list'
-
- def get_queryset(self):
- return Issue.objects.order_by('create_date')
-
-
-class DetailView(LoginRequiredMixin, generic.DetailView):
- model = Issue
- template_name = 'issues/detail.html'
- pk_url_kwarg = 'issue_id'
-
-
-# class NewIssueForm(LoginRequiredMixin, generic.FormView):
-# template_name = 'issues/new.html'
-# form_class = IssueForm
-# success_url =
-
-@login_required
-def new(request):
- if request.method == 'POST':
- form = IssueForm(request.POST)
- if form.is_valid():
- new_issue = form.save()
- return HttpResponseRedirect('/issues/{}'.format(new_issue.id))
- else:
- form = IssueForm()
-
- return render(request, 'issues/new.html', {
- 'form': form,
- })
diff --git a/manage.py b/manage.py
deleted file mode 100755
index dd7d3a3..0000000
--- a/manage.py
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/env python3
-import os
-import sys
-
-if __name__ == '__main__':
- os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'tofu.settings')
- try:
- from django.core.management import execute_from_command_line
- except ImportError as exc:
- raise ImportError(
- "Couldn't import Django. Are you sure it's installed and "
- "available on your PYTHONPATH environment variable? Did you "
- "forget to activate a virtual environment?"
- ) from exc
- execute_from_command_line(sys.argv)
diff --git a/projects/__init__.py b/projects/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/projects/admin.py b/projects/admin.py
deleted file mode 100644
index badc1bb..0000000
--- a/projects/admin.py
+++ /dev/null
@@ -1,5 +0,0 @@
-from django.contrib import admin
-
-from .models import Project
-
-admin.site.register(Project)
diff --git a/projects/apps.py b/projects/apps.py
deleted file mode 100644
index 3ef44de..0000000
--- a/projects/apps.py
+++ /dev/null
@@ -1,5 +0,0 @@
-from django.apps import AppConfig
-
-
-class ProjectsConfig(AppConfig):
- name = 'projects'
diff --git a/projects/migrations/0001_initial.py b/projects/migrations/0001_initial.py
deleted file mode 100644
index 55089c4..0000000
--- a/projects/migrations/0001_initial.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# Generated by Django 2.2.1 on 2019-05-27 12:56
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
- initial = True
-
- dependencies = [
- ]
-
- operations = [
- migrations.CreateModel(
- name='Project',
- fields=[
- ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('project_key', models.CharField(max_length=16, unique=True)),
- ('name', models.CharField(max_length=200)),
- ('description', models.TextField(blank=True)),
- ],
- ),
- ]
diff --git a/projects/migrations/__init__.py b/projects/migrations/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/projects/models.py b/projects/models.py
deleted file mode 100644
index 9345b06..0000000
--- a/projects/models.py
+++ /dev/null
@@ -1,10 +0,0 @@
-from django.db import models
-
-
-class Project(models.Model):
- project_key = models.CharField(max_length=16, unique=True)
- name = models.CharField(max_length=200)
- description = models.TextField(blank=True)
-
- def __str__(self):
- return '{} - {}'.format(self.project_key, self.name)
diff --git a/projects/templates/projects/index.html b/projects/templates/projects/index.html
deleted file mode 100644
index ee9bb64..0000000
--- a/projects/templates/projects/index.html
+++ /dev/null
@@ -1,17 +0,0 @@
-{% extends "base.html" %}
-
-{% block title %}Projects{% endblock %}
-
-{% block content %}
- {% if project_list %}
-
- {% else %}
- No projects.
- {% endif %}
-{% endblock %}
diff --git a/projects/templates/projects/view.html b/projects/templates/projects/view.html
deleted file mode 100644
index afae756..0000000
--- a/projects/templates/projects/view.html
+++ /dev/null
@@ -1,21 +0,0 @@
-{% extends "base.html" %}
-
-{% block title %}Project: {{ project.name }}{% endblock %}
-
-{% block content %}
- {{ project.project_key }} - {{ project.name }}
- {{ project.description }}
-
- Issues
- {% if issue_list %}
-
- {% else %}
- This project has no issues yet.
- {% endif %}
-{% endblock %}
diff --git a/projects/tests.py b/projects/tests.py
deleted file mode 100644
index 7ce503c..0000000
--- a/projects/tests.py
+++ /dev/null
@@ -1,3 +0,0 @@
-from django.test import TestCase
-
-# Create your tests here.
diff --git a/projects/urls.py b/projects/urls.py
deleted file mode 100644
index 3b0b3b9..0000000
--- a/projects/urls.py
+++ /dev/null
@@ -1,9 +0,0 @@
-from django.urls import path
-
-from . import views
-
-app_name = 'projects'
-urlpatterns = [
- path('', views.IndexView.as_view(), name='index'),
- path('/', views.ProjectView.as_view(), name='view'),
-]
diff --git a/projects/views.py b/projects/views.py
deleted file mode 100644
index 3886a1e..0000000
--- a/projects/views.py
+++ /dev/null
@@ -1,22 +0,0 @@
-from django.contrib.auth.mixins import LoginRequiredMixin
-from django.views import generic
-
-from .models import Project
-
-class IndexView(LoginRequiredMixin, generic.ListView):
- template_name = 'projects/index.html'
- context_object_name = 'project_list'
-
- def get_queryset(self):
- return Project.objects.order_by('project_key')
-
-
-class ProjectView(LoginRequiredMixin, generic.DetailView):
- model = Project
- template_name = 'projects/view.html'
- slug_field = slug_url_kwarg = 'project_key'
-
- def get_context_data(self, **kwargs):
- context = super().get_context_data(**kwargs)
- context['issue_list'] = self.get_object().issue_set.order_by('create_date')
- return context
diff --git a/requirements.txt b/requirements.txt
deleted file mode 100644
index d3e4ba5..0000000
--- a/requirements.txt
+++ /dev/null
@@ -1 +0,0 @@
-django
diff --git a/static/css/style.css b/static/css/style.css
deleted file mode 100644
index ad01985..0000000
--- a/static/css/style.css
+++ /dev/null
@@ -1,52 +0,0 @@
-:root {
- --main-bg-color: #121212;
- --main-text-color-normal: #cccccc;
- --main-text-color-light: #eeeeee;
-
- /* Generated by Paletton.com */
- /* http://paletton.com/#uid=54W0u0kiCFn8GVde7NVmtwSqXtg */
- --primary-color-0: #C351C3;
- --primary-color-1: #EFAEEF;
- --primary-color-2: #DB7ADB;
- --primary-color-3: #A832A8;
- --primary-color-4: #981898;
-
- --secondary-color-1-0: #8B5DC8;
- --secondary-color-1-1: #CEB5F0;
- --secondary-color-1-2: #AA84DD;
- --secondary-color-1-3: #6F3FAF;
- --secondary-color-1-4: #59249E;
-
- --secondary-color-2-0: #ED638D;
- --secondary-color-2-1: #FAB6CB;
- --secondary-color-2-2: #F488A9;
- --secondary-color-2-3: #E54475;
- --secondary-color-2-4: #D02156;
-}
-
-html {
- font-family: sans-serif;
-}
-
-body {
- background-color: var(--main-bg-color);
- color: var(--main-text-color-normal);
- margin: 0;
-}
-
-h1, h2, h3, h4, h5, h6 {
- color: var(--main-text-color-light);
-}
-
-a {
- color: var(--primary-color-2);
- text-decoration: none;
-}
-
-a:hover {
- color: var(--primary-color-1);
-}
-
-a:focus {
- color: var(--primary-color-1);
-}
diff --git a/templates/base.html b/templates/base.html
deleted file mode 100644
index b8d8058..0000000
--- a/templates/base.html
+++ /dev/null
@@ -1,18 +0,0 @@
-{% load static %}
-
-
-
-
- {% block title %}Tofu{% endblock %} - Tofu
-
-
-
-
-
- Tofu
-
-
- {% block content %}No content.{% endblock %}
-
-
-
diff --git a/templates/registration/login.html b/templates/registration/login.html
deleted file mode 100644
index f3d53be..0000000
--- a/templates/registration/login.html
+++ /dev/null
@@ -1,13 +0,0 @@
-{% extends "base.html" %}
-
-{% block title %}Login{% endblock %}
-
-{% block content %}
- Login
-
-
-{% endblock %}
diff --git a/tofu/__init__.py b/tofu/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/tofu/settings.py b/tofu/settings.py
deleted file mode 100644
index 2971575..0000000
--- a/tofu/settings.py
+++ /dev/null
@@ -1,135 +0,0 @@
-"""
-Django settings for tofu project.
-
-Generated by 'django-admin startproject' using Django 2.1.7.
-
-For more information on this file, see
-https://docs.djangoproject.com/en/2.1/topics/settings/
-
-For the full list of settings and their values, see
-https://docs.djangoproject.com/en/2.1/ref/settings/
-"""
-
-import os
-
-# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
-BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
-
-
-# Quick-start development settings - unsuitable for production
-# See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/
-
-# SECURITY WARNING: keep the secret key used in production secret!
-SECRET_KEY = 'p53=*^ls87h6@*b^-d&t!0suv4r5slw=o(%ji!v+ap_%_!lmm2'
-
-# SECURITY WARNING: don't run with debug turned on in production!
-DEBUG = True
-
-ALLOWED_HOSTS = []
-
-
-# Application definition
-
-INSTALLED_APPS = [
- 'issues.apps.IssuesConfig',
- 'projects.apps.ProjectsConfig',
- 'django.contrib.admin',
- 'django.contrib.auth',
- 'django.contrib.contenttypes',
- 'django.contrib.sessions',
- 'django.contrib.messages',
- 'django.contrib.staticfiles',
-]
-
-MIDDLEWARE = [
- 'django.middleware.security.SecurityMiddleware',
- 'django.contrib.sessions.middleware.SessionMiddleware',
- 'django.middleware.common.CommonMiddleware',
- 'django.middleware.csrf.CsrfViewMiddleware',
- 'django.contrib.auth.middleware.AuthenticationMiddleware',
- 'django.contrib.messages.middleware.MessageMiddleware',
- 'django.middleware.clickjacking.XFrameOptionsMiddleware',
-]
-
-ROOT_URLCONF = 'tofu.urls'
-
-TEMPLATES = [
- {
- 'BACKEND': 'django.template.backends.django.DjangoTemplates',
- 'DIRS': [
- os.path.join(BASE_DIR, 'templates'),
- ],
- 'APP_DIRS': True,
- 'OPTIONS': {
- 'context_processors': [
- 'django.template.context_processors.debug',
- 'django.template.context_processors.request',
- 'django.contrib.auth.context_processors.auth',
- 'django.contrib.messages.context_processors.messages',
- ],
- },
- },
-]
-
-WSGI_APPLICATION = 'tofu.wsgi.application'
-
-
-# Database
-# https://docs.djangoproject.com/en/2.1/ref/settings/#databases
-
-DATABASES = {
- 'default': {
- 'ENGINE': 'django.db.backends.sqlite3',
- 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
- }
-}
-
-
-# Password validation
-# https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators
-
-AUTH_PASSWORD_VALIDATORS = [
- {
- 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
- },
- {
- 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
- },
- {
- 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
- },
- {
- 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
- },
-]
-
-
-# Internationalization
-# https://docs.djangoproject.com/en/2.1/topics/i18n/
-
-LANGUAGE_CODE = 'en-us'
-
-TIME_ZONE = 'Europe/Berlin'
-
-USE_I18N = True
-
-USE_L10N = True
-
-USE_TZ = True
-
-
-# Static files (CSS, JavaScript, Images)
-# https://docs.djangoproject.com/en/2.1/howto/static-files/
-
-STATIC_URL = '/static/'
-
-STATICFILES_DIRS = [
- os.path.join(BASE_DIR, "static"),
-]
-
-
-# Other settings
-
-LOGIN_URL = '/account/login/'
-LOGIN_REDIRECT_URL = '/projects/'
-LOGOUT_REDIRECT_URL = '/account/login/'
diff --git a/tofu/urls.py b/tofu/urls.py
deleted file mode 100644
index 596418a..0000000
--- a/tofu/urls.py
+++ /dev/null
@@ -1,29 +0,0 @@
-"""tofu URL Configuration
-
-The `urlpatterns` list routes URLs to views. For more information please see:
- https://docs.djangoproject.com/en/2.1/topics/http/urls/
-Examples:
-Function views
- 1. Add an import: from my_app import views
- 2. Add a URL to urlpatterns: path('', views.home, name='home')
-Class-based views
- 1. Add an import: from other_app.views import Home
- 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
-Including another URLconf
- 1. Import the include() function: from django.urls import include, path
- 2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
-"""
-from django.contrib import admin
-from django.shortcuts import redirect
-from django.urls import include, path
-
-urlpatterns = [
- path('account/', include('django.contrib.auth.urls')),
- path('issues/', include('issues.urls')),
- path('projects/', include('projects.urls')),
-
- path('admin/', admin.site.urls),
-
- # TODO temporarily: just redirect / to /projects/
- path('', lambda request: redirect('projects/', permanent=False)),
-]
diff --git a/tofu/wsgi.py b/tofu/wsgi.py
deleted file mode 100644
index 9c30b16..0000000
--- a/tofu/wsgi.py
+++ /dev/null
@@ -1,16 +0,0 @@
-"""
-WSGI config for tofu project.
-
-It exposes the WSGI callable as a module-level variable named ``application``.
-
-For more information on this file, see
-https://docs.djangoproject.com/en/2.1/howto/deployment/wsgi/
-"""
-
-import os
-
-from django.core.wsgi import get_wsgi_application
-
-os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'tofu.settings')
-
-application = get_wsgi_application()