diff --git a/src/newsreader/accounts/templates/accounts/components/login-form.html b/src/newsreader/accounts/templates/accounts/components/login-form.html
new file mode 100644
index 0000000..87dceb9
--- /dev/null
+++ b/src/newsreader/accounts/templates/accounts/components/login-form.html
@@ -0,0 +1,17 @@
+{% extends "components/form/form.html" %}
+{% load i18n %}
+
+{% block actions %}
+
+{% endblock actions %}
diff --git a/src/newsreader/accounts/templates/accounts/components/settings-form.html b/src/newsreader/accounts/templates/accounts/components/settings-form.html
new file mode 100644
index 0000000..ff06cb7
--- /dev/null
+++ b/src/newsreader/accounts/templates/accounts/components/settings-form.html
@@ -0,0 +1,18 @@
+{% extends "components/form/form.html" %}
+{% load i18n %}
+
+{% block actions %}
+
+{% endblock actions %}
diff --git a/src/newsreader/accounts/templates/accounts/login.html b/src/newsreader/accounts/templates/accounts/login.html
deleted file mode 100644
index ab308b2..0000000
--- a/src/newsreader/accounts/templates/accounts/login.html
+++ /dev/null
@@ -1,24 +0,0 @@
-{% extends "base.html" %}
-
-{% load static %}
-
-{% block content %}
-
-
-
-{% endblock %}
diff --git a/src/newsreader/accounts/templates/accounts/password_change.html b/src/newsreader/accounts/templates/accounts/password_change.html
deleted file mode 100644
index 1ece1dd..0000000
--- a/src/newsreader/accounts/templates/accounts/password_change.html
+++ /dev/null
@@ -1,22 +0,0 @@
-{% extends "base.html" %}
-{% load static i18n %}
-
-{% block content %}
-
-
-
-{% endblock %}
diff --git a/src/newsreader/accounts/templates/accounts/settings.html b/src/newsreader/accounts/templates/accounts/settings.html
deleted file mode 100644
index 29a2ee9..0000000
--- a/src/newsreader/accounts/templates/accounts/settings.html
+++ /dev/null
@@ -1,42 +0,0 @@
-{% extends "base.html" %}
-{% load i18n %}
-
-{% block content %}
-
-
-
-{% endblock %}
diff --git a/src/newsreader/accounts/templates/accounts/views/login.html b/src/newsreader/accounts/templates/accounts/views/login.html
new file mode 100644
index 0000000..b4c391d
--- /dev/null
+++ b/src/newsreader/accounts/templates/accounts/views/login.html
@@ -0,0 +1,7 @@
+{% extends "base.html" %}
+
+{% block content %}
+
+ {% include "accounts/components/login-form.html" with form=form title="Login" confirm_text="Login" %}
+
+{% endblock %}
diff --git a/src/newsreader/accounts/templates/accounts/views/password-change.html b/src/newsreader/accounts/templates/accounts/views/password-change.html
new file mode 100644
index 0000000..fb8a98b
--- /dev/null
+++ b/src/newsreader/accounts/templates/accounts/views/password-change.html
@@ -0,0 +1,8 @@
+{% extends "base.html" %}
+
+{% block content %}
+
+ {% url 'accounts:settings' as cancel_url %}
+ {% include "components/form/form.html" with form=form title="Change password" confirm_text="Change password" cancel_url=cancel_url %}
+
+{% endblock %}
diff --git a/src/newsreader/accounts/templates/accounts/views/settings.html b/src/newsreader/accounts/templates/accounts/views/settings.html
new file mode 100644
index 0000000..bf01f8e
--- /dev/null
+++ b/src/newsreader/accounts/templates/accounts/views/settings.html
@@ -0,0 +1,7 @@
+{% extends "base.html" %}
+
+{% block content %}
+
+ {% include "accounts/components/settings-form.html" with form=form title="User profile" confirm_text="Save" %}
+
+{% endblock %}
diff --git a/src/newsreader/accounts/views.py b/src/newsreader/accounts/views.py
index c0342b2..fed60eb 100644
--- a/src/newsreader/accounts/views.py
+++ b/src/newsreader/accounts/views.py
@@ -11,7 +11,7 @@ from newsreader.accounts.models import User
class LoginView(django_views.LoginView):
- template_name = "accounts/login.html"
+ template_name = "accounts/views/login.html"
success_url = reverse_lazy("index")
@@ -74,32 +74,32 @@ class ActivationResendView(registration_views.ResendActivationView):
# prompts for a new password
# PasswordResetCompleteView shows a success message for the above
class PasswordResetView(django_views.PasswordResetView):
- template_name = "password-reset/password_reset_form.html"
- subject_template_name = "password-reset/password_reset_subject.txt"
- email_template_name = "password-reset/password_reset_email.html"
+ template_name = "password-reset/password-reset.html"
+ subject_template_name = "password-reset/password-reset-subject.txt"
+ email_template_name = "password-reset/password-reset-email.html"
success_url = reverse_lazy("accounts:password-reset-done")
class PasswordResetDoneView(django_views.PasswordResetDoneView):
- template_name = "password-reset/password_reset_done.html"
+ template_name = "password-reset/password-reset-done.html"
class PasswordResetConfirmView(django_views.PasswordResetConfirmView):
- template_name = "password-reset/password_reset_confirm.html"
+ template_name = "password-reset/password-reset-confirm.html"
success_url = reverse_lazy("accounts:password-reset-complete")
class PasswordResetCompleteView(django_views.PasswordResetCompleteView):
- template_name = "password-reset/password_reset_complete.html"
+ template_name = "password-reset/password-reset-complete.html"
class PasswordChangeView(django_views.PasswordChangeView):
- template_name = "accounts/password_change.html"
+ template_name = "accounts/views/password-change.html"
success_url = reverse_lazy("accounts:settings")
class SettingsView(ModelFormMixin, FormView):
- template_name = "accounts/settings.html"
+ template_name = "accounts/views/settings.html"
success_url = reverse_lazy("accounts:settings")
form_class = UserSettingsForm
model = User
diff --git a/src/newsreader/conf/base.py b/src/newsreader/conf/base.py
index 6bc2840..ee5a296 100644
--- a/src/newsreader/conf/base.py
+++ b/src/newsreader/conf/base.py
@@ -172,6 +172,8 @@ AUTH_PASSWORD_VALIDATORS = [
# Authentication user model
AUTH_USER_MODEL = "accounts.User"
+LOGIN_REDIRECT_URL = "/"
+
# Internationalization
# https://docs.djangoproject.com/en/2.2/topics/i18n/
LANGUAGE_CODE = "en-us"
diff --git a/src/newsreader/news/collection/forms.py b/src/newsreader/news/collection/forms.py
index bfa0d90..7e5fc97 100644
--- a/src/newsreader/news/collection/forms.py
+++ b/src/newsreader/news/collection/forms.py
@@ -1,4 +1,5 @@
from django import forms
+from django.utils.translation import gettext_lazy as _
import pytz
@@ -11,6 +12,7 @@ class CollectionRuleForm(forms.ModelForm):
timezone = forms.ChoiceField(
widget=forms.Select(attrs={"size": len(pytz.all_timezones)}),
choices=((timezone, timezone) for timezone in pytz.all_timezones),
+ help_text=_("The timezone which the feed uses"),
)
def __init__(self, *args, **kwargs):
diff --git a/src/newsreader/news/collection/templates/collection/import.html b/src/newsreader/news/collection/templates/collection/import.html
deleted file mode 100644
index 0ca15ab..0000000
--- a/src/newsreader/news/collection/templates/collection/import.html
+++ /dev/null
@@ -1,37 +0,0 @@
-{% extends "base.html" %}
-
-{% load static i18n %}
-
-{% block content %}
-
-
-
-{% endblock %}
diff --git a/src/newsreader/news/collection/templates/collection/rule-create.html b/src/newsreader/news/collection/templates/collection/rule-create.html
deleted file mode 100644
index b8db042..0000000
--- a/src/newsreader/news/collection/templates/collection/rule-create.html
+++ /dev/null
@@ -1,9 +0,0 @@
-{% extends "collection/rule.html" %}
-
-{% block form-header %}
-
-{% endblock %}
-
-{% block confirm-button %}
- Create rule
-{% endblock %}
diff --git a/src/newsreader/news/collection/templates/collection/rule-update.html b/src/newsreader/news/collection/templates/collection/rule-update.html
deleted file mode 100644
index 403f86e..0000000
--- a/src/newsreader/news/collection/templates/collection/rule-update.html
+++ /dev/null
@@ -1,9 +0,0 @@
-{% extends "collection/rule.html" %}
-
-{% block form-header %}
-
-{% endblock %}
-
-{% block confirm-button %}
- Save rule
-{% endblock %}
diff --git a/src/newsreader/news/collection/templates/collection/rule.html b/src/newsreader/news/collection/templates/collection/rule.html
deleted file mode 100644
index c7f56f4..0000000
--- a/src/newsreader/news/collection/templates/collection/rule.html
+++ /dev/null
@@ -1,55 +0,0 @@
-{% extends "base.html" %}
-
-{% load static %}
-
-{% block content %}
-
-
-
-{% endblock %}
diff --git a/src/newsreader/news/collection/templates/collection/rules.html b/src/newsreader/news/collection/templates/collection/rules.html
deleted file mode 100644
index 32b6f24..0000000
--- a/src/newsreader/news/collection/templates/collection/rules.html
+++ /dev/null
@@ -1,69 +0,0 @@
-{% extends "base.html" %}
-{% load i18n static %}
-
-{% block content %}
-
-
-
-
-{% endblock %}
diff --git a/src/newsreader/news/collection/templates/news/collection/views/import.html b/src/newsreader/news/collection/templates/news/collection/views/import.html
new file mode 100644
index 0000000..df19887
--- /dev/null
+++ b/src/newsreader/news/collection/templates/news/collection/views/import.html
@@ -0,0 +1,9 @@
+{% extends "base.html" %}
+{% load static %}
+
+{% block content %}
+
+ {% url "news:collection:rules" as cancel_url %}
+ {% include "components/form/form.html" with form=form title="Import an OPML file" cancel_url=cancel_url confirm_text="Import rules" %}
+
+{% endblock %}
diff --git a/src/newsreader/news/collection/templates/news/collection/views/rule-create.html b/src/newsreader/news/collection/templates/news/collection/views/rule-create.html
new file mode 100644
index 0000000..82ed6c5
--- /dev/null
+++ b/src/newsreader/news/collection/templates/news/collection/views/rule-create.html
@@ -0,0 +1,9 @@
+{% extends "base.html" %}
+{% load static %}
+
+{% block content %}
+
+ {% url "news:collection:rules" as cancel_url %}
+ {% include "components/form/form.html" with form=form title="Create rule" cancel_url=cancel_url confirm_text="Create rule" %}
+
+{% endblock %}
diff --git a/src/newsreader/news/collection/templates/news/collection/views/rule-update.html b/src/newsreader/news/collection/templates/news/collection/views/rule-update.html
new file mode 100644
index 0000000..3f0a8fe
--- /dev/null
+++ b/src/newsreader/news/collection/templates/news/collection/views/rule-update.html
@@ -0,0 +1,9 @@
+{% extends "base.html" %}
+{% load static %}
+
+{% block content %}
+
+ {% url "news:collection:rules" as cancel_url %}
+ {% include "components/form/form.html" with form=form title="Update rule" cancel_url=cancel_url confirm_text="Save rule" %}
+
+{% endblock %}
diff --git a/src/newsreader/news/collection/templates/news/collection/views/rules.html b/src/newsreader/news/collection/templates/news/collection/views/rules.html
new file mode 100644
index 0000000..a17b818
--- /dev/null
+++ b/src/newsreader/news/collection/templates/news/collection/views/rules.html
@@ -0,0 +1,79 @@
+{% extends "base.html" %}
+{% load i18n static %}
+
+{% block content %}
+
+
+
+
+
+{% endblock %}
diff --git a/src/newsreader/news/collection/views.py b/src/newsreader/news/collection/views.py
index 3580951..6fb88df 100644
--- a/src/newsreader/news/collection/views.py
+++ b/src/newsreader/news/collection/views.py
@@ -48,21 +48,21 @@ class CollectionRuleDetailMixin:
class CollectionRuleListView(CollectionRuleViewMixin, ListView):
paginate_by = 50
- template_name = "collection/rules.html"
+ template_name = "news/collection/views/rules.html"
context_object_name = "rules"
class CollectionRuleUpdateView(
CollectionRuleViewMixin, CollectionRuleDetailMixin, UpdateView
):
- template_name = "collection/rule-update.html"
+ template_name = "news/collection/views/rule-update.html"
context_object_name = "rule"
class CollectionRuleCreateView(
CollectionRuleViewMixin, CollectionRuleDetailMixin, CreateView
):
- template_name = "collection/rule-create.html"
+ template_name = "news/collection/views/rule-create.html"
class CollectionRuleBulkView(FormView):
@@ -122,7 +122,7 @@ class CollectionRuleBulkDeleteView(CollectionRuleBulkView):
class OPMLImportView(FormView):
form_class = OPMLImportForm
success_url = reverse_lazy("news:collection:rules")
- template_name = "collection/import.html"
+ template_name = "news/collection/views/import.html"
def form_valid(self, form):
user = self.request.user
diff --git a/src/newsreader/news/core/forms.py b/src/newsreader/news/core/forms.py
index a86e2b2..a08022a 100644
--- a/src/newsreader/news/core/forms.py
+++ b/src/newsreader/news/core/forms.py
@@ -1,15 +1,27 @@
from django import forms
+from django.forms.widgets import CheckboxSelectMultiple
from newsreader.accounts.models import User
from newsreader.news.collection.models import CollectionRule
from newsreader.news.core.models import Category
+class RulesWidget(CheckboxSelectMultiple):
+ template_name = "news/core/widgets/rules.html"
+ option_template_name = "news/core/widgets/rule.html"
+
+ def create_option(self, *args, **kwargs):
+ option = super().create_option(*args, **kwargs)
+ instance = self.choices.queryset.get(pk=option["value"])
+
+ if self.category and instance.category:
+ option["selected"] = self.category.pk == instance.category.pk
+ return {**option, "instance": instance}
+
+
class CategoryForm(forms.ModelForm):
rules = forms.ModelMultipleChoiceField(
- required=False,
- queryset=CollectionRule.objects.all(),
- widget=forms.widgets.CheckboxSelectMultiple,
+ required=False, queryset=CollectionRule.objects.none(), widget=RulesWidget
)
user = forms.ModelChoiceField(
@@ -23,6 +35,8 @@ class CategoryForm(forms.ModelForm):
super().__init__(*args, **kwargs)
self.fields["rules"].queryset = CollectionRule.objects.filter(user=self.user)
+ self.fields["rules"].widget.category = self.instance
+
self.fields["user"].queryset = User.objects.filter(pk=self.user.pk)
self.initial["user"] = self.user
diff --git a/src/newsreader/news/core/templates/core/category-create.html b/src/newsreader/news/core/templates/core/category-create.html
deleted file mode 100644
index 73d05b5..0000000
--- a/src/newsreader/news/core/templates/core/category-create.html
+++ /dev/null
@@ -1,9 +0,0 @@
-{% extends "core/category.html" %}
-
-{% block form-header %}
-
-{% endblock %}
-
-{% block confirm-button %}
- Create category
-{% endblock %}
diff --git a/src/newsreader/news/core/templates/core/category-update.html b/src/newsreader/news/core/templates/core/category-update.html
deleted file mode 100644
index 3e50df9..0000000
--- a/src/newsreader/news/core/templates/core/category-update.html
+++ /dev/null
@@ -1,9 +0,0 @@
-{% extends "core/category.html" %}
-
-{% block form-header %}
-
-{% endblock %}
-
-{% block confirm-button %}
- Save category
-{% endblock %}
diff --git a/src/newsreader/news/core/templates/core/category.html b/src/newsreader/news/core/templates/core/category.html
deleted file mode 100644
index bee0585..0000000
--- a/src/newsreader/news/core/templates/core/category.html
+++ /dev/null
@@ -1,62 +0,0 @@
-{% extends "base.html" %}
-
-{% load static %}
-
-{% block content %}
-
-
-
-{% endblock %}
diff --git a/src/newsreader/news/core/templates/core/categories.html b/src/newsreader/news/core/templates/news/core/views/categories.html
similarity index 99%
rename from src/newsreader/news/core/templates/core/categories.html
rename to src/newsreader/news/core/templates/news/core/views/categories.html
index be4a449..35fc741 100644
--- a/src/newsreader/news/core/templates/core/categories.html
+++ b/src/newsreader/news/core/templates/news/core/views/categories.html
@@ -1,5 +1,4 @@
{% extends "base.html" %}
-
{% load static %}
{% block content %}
diff --git a/src/newsreader/news/core/templates/news/core/views/category-create.html b/src/newsreader/news/core/templates/news/core/views/category-create.html
new file mode 100644
index 0000000..6da166f
--- /dev/null
+++ b/src/newsreader/news/core/templates/news/core/views/category-create.html
@@ -0,0 +1,9 @@
+{% extends "base.html" %}
+{% load static %}
+
+{% block content %}
+
+ {% url "news:core:categories" as cancel_url %}
+ {% include "components/form/form.html" with form=form title="Create category" cancel_url=cancel_url confirm_text="Create category" %}
+
+{% endblock %}
diff --git a/src/newsreader/news/core/templates/news/core/views/category-update.html b/src/newsreader/news/core/templates/news/core/views/category-update.html
new file mode 100644
index 0000000..1ec1487
--- /dev/null
+++ b/src/newsreader/news/core/templates/news/core/views/category-update.html
@@ -0,0 +1,9 @@
+{% extends "base.html" %}
+{% load static %}
+
+{% block content %}
+
+ {% url "news:core:categories" as cancel_url %}
+ {% include "components/form/form.html" with form=form title="Update category" cancel_url=cancel_url confirm_text="Save category" %}
+
+{% endblock %}
diff --git a/src/newsreader/news/core/templates/core/homepage.html b/src/newsreader/news/core/templates/news/core/views/homepage.html
similarity index 99%
rename from src/newsreader/news/core/templates/core/homepage.html
rename to src/newsreader/news/core/templates/news/core/views/homepage.html
index 8904517..79e1ccc 100644
--- a/src/newsreader/news/core/templates/core/homepage.html
+++ b/src/newsreader/news/core/templates/news/core/views/homepage.html
@@ -1,5 +1,4 @@
{% extends "base.html" %}
-
{% load static %}
{% block content %}
diff --git a/src/newsreader/news/core/templates/news/core/widgets/rule.html b/src/newsreader/news/core/templates/news/core/widgets/rule.html
new file mode 100644
index 0000000..b3c7b68
--- /dev/null
+++ b/src/newsreader/news/core/templates/news/core/widgets/rule.html
@@ -0,0 +1,10 @@
+
+
+{% if option.instance.favicon %}
+
+{% else %}
+
+{% endif %}
+
+{{ option.label }}
diff --git a/src/newsreader/news/core/templates/news/core/widgets/rules.html b/src/newsreader/news/core/templates/news/core/widgets/rules.html
new file mode 100644
index 0000000..bbdd43a
--- /dev/null
+++ b/src/newsreader/news/core/templates/news/core/widgets/rules.html
@@ -0,0 +1,9 @@
+
+ {% for group, options, index in widget.optgroups %}
+ {% for option in options %}
+
+ {% include "news/core/widgets/rule.html" with option=option only %}
+
+ {% endfor %}
+ {% endfor %}
+
diff --git a/src/newsreader/news/core/views.py b/src/newsreader/news/core/views.py
index 2a75ea7..9ef81eb 100644
--- a/src/newsreader/news/core/views.py
+++ b/src/newsreader/news/core/views.py
@@ -9,7 +9,7 @@ from newsreader.news.core.models import Category
class NewsView(TemplateView):
- template_name = "core/homepage.html"
+ template_name = "news/core/views/homepage.html"
# TODO serialize objects to show filled main page
def get_context_data(self, **kwargs):
@@ -55,14 +55,14 @@ class CategoryDetailMixin:
class CategoryListView(CategoryViewMixin, ListView):
- template_name = "core/categories.html"
+ template_name = "news/core/views/categories.html"
context_object_name = "categories"
class CategoryUpdateView(CategoryViewMixin, CategoryDetailMixin, UpdateView):
- template_name = "core/category-update.html"
+ template_name = "news/core/views/category-update.html"
context_object_name = "category"
class CategoryCreateView(CategoryViewMixin, CategoryDetailMixin, CreateView):
- template_name = "core/category-create.html"
+ template_name = "news/core/views/category-create.html"
diff --git a/src/newsreader/scss/components/form/_activation-form.scss b/src/newsreader/scss/components/form/_activation-form.scss
deleted file mode 100644
index 39ecc27..0000000
--- a/src/newsreader/scss/components/form/_activation-form.scss
+++ /dev/null
@@ -1,11 +0,0 @@
-.activation-form {
- margin: 10px 0;
- & h4 {
- padding: 20px 24px 5px 24px;
- }
-
- &__fieldset:last-child {
- flex-direction: row;
- justify-content: space-between;
- }
-}
diff --git a/src/newsreader/scss/components/form/_category-form.scss b/src/newsreader/scss/components/form/_category-form.scss
deleted file mode 100644
index 8132ed2..0000000
--- a/src/newsreader/scss/components/form/_category-form.scss
+++ /dev/null
@@ -1,13 +0,0 @@
-.category-form {
- @extend .form;
-
- margin: 20px 0;
-
- &__section:last-child {
- & .category-form__fieldset {
- display: flex;
- flex-direction: row;
- justify-content: space-between;
- }
- }
-}
diff --git a/src/newsreader/scss/components/form/_form.scss b/src/newsreader/scss/components/form/_form.scss
index 5b97958..19e9d4b 100644
--- a/src/newsreader/scss/components/form/_form.scss
+++ b/src/newsreader/scss/components/form/_form.scss
@@ -1,3 +1,5 @@
+@import "mixin.scss";
+
.form {
display: flex;
flex-direction: column;
@@ -8,6 +10,29 @@
font-family: $form-font;
background-color: $white;
+ &__section {
+ &--last {
+ & .form__fieldset {
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ }
+ }
+
+ &--actions {
+ display: flex;
+ flex-direction: row !important;
+
+ & .form__fieldset {
+ flex-direction: row;
+
+ & > * {
+ margin: 0 0 0 5px;
+ }
+ }
+ }
+ }
+
&__fieldset {
@extend .fieldset;
}
@@ -16,21 +41,24 @@
display: flex;
flex-direction: row;
- padding: 15px;
+ @include form-padding;
}
&__actions {
display: flex;
- justify-content: space-between;
+ flex-direction: row;
- width: 50%;
- padding: 15px;
+ @include form-padding;
}
&__title {
font-size: 18px;
}
+ &__intro {
+ @include form-padding;
+ }
+
& .favicon {
height: 20px;
}
diff --git a/src/newsreader/scss/components/form/_import-form.scss b/src/newsreader/scss/components/form/_import-form.scss
deleted file mode 100644
index 19acc5c..0000000
--- a/src/newsreader/scss/components/form/_import-form.scss
+++ /dev/null
@@ -1,17 +0,0 @@
-.import-form {
- margin: 20px 0;
-
- &__fieldset:last-child {
- display: flex;
- flex-direction: row;
- justify-content: space-between;
- }
-
- & input[type=file] {
- width: 50%;
- }
-
- & input[type=checkbox] {
- margin: 0 auto 0 10px;
- }
-}
diff --git a/src/newsreader/scss/components/form/_login-form.scss b/src/newsreader/scss/components/form/_login-form.scss
deleted file mode 100644
index 10e81a0..0000000
--- a/src/newsreader/scss/components/form/_login-form.scss
+++ /dev/null
@@ -1,33 +0,0 @@
-.login-form {
- @extend .form;
-
- width: 100%;
-
- h4 {
- margin: 0;
- padding: 20px 24px 5px 24px;
- }
-
- &__fieldset {
- @extend .form__fieldset;
-
- & label {
- @extend .label;
- }
-
- & input {
- @extend .input;
- }
- }
-
- &__fieldset:last-child {
- flex-direction: row-reverse;
- justify-content: space-between;
- }
-
- &__fieldset:last-child {
- .button {
- padding: 10px 50px;
- }
- }
-}
diff --git a/src/newsreader/scss/components/form/_mixin.scss b/src/newsreader/scss/components/form/_mixin.scss
new file mode 100644
index 0000000..4f55a9e
--- /dev/null
+++ b/src/newsreader/scss/components/form/_mixin.scss
@@ -0,0 +1,3 @@
+@mixin form-padding {
+ padding: 15px;
+}
diff --git a/src/newsreader/scss/components/form/_password-reset-confirm-form.scss b/src/newsreader/scss/components/form/_password-reset-confirm-form.scss
deleted file mode 100644
index d570c38..0000000
--- a/src/newsreader/scss/components/form/_password-reset-confirm-form.scss
+++ /dev/null
@@ -1,3 +0,0 @@
-.password-reset-confirm-form {
- margin: 20px 0;
-}
diff --git a/src/newsreader/scss/components/form/_password-reset-form.scss b/src/newsreader/scss/components/form/_password-reset-form.scss
deleted file mode 100644
index be92ff4..0000000
--- a/src/newsreader/scss/components/form/_password-reset-form.scss
+++ /dev/null
@@ -1,18 +0,0 @@
-.password-reset-form {
- margin: 20px 0;
-
- &__fieldset:last-child {
- display: flex;
- flex-direction: row;
- justify-content: space-between;
- }
-
- & .form__header {
- display: flex;
- flex-direction: column;
- }
-
- & .form__title {
- margin: 0 0 5px 0;
- }
-}
diff --git a/src/newsreader/scss/components/form/_register-form.scss b/src/newsreader/scss/components/form/_register-form.scss
deleted file mode 100644
index e406ae7..0000000
--- a/src/newsreader/scss/components/form/_register-form.scss
+++ /dev/null
@@ -1,11 +0,0 @@
-.register-form {
- margin: 10px 0;
- & h4 {
- padding: 20px 24px 5px 24px;
- }
-
- &__fieldset:last-child {
- flex-direction: row;
- justify-content: space-between;
- }
-}
diff --git a/src/newsreader/scss/components/form/_rule-form.scss b/src/newsreader/scss/components/form/_rule-form.scss
deleted file mode 100644
index 82651aa..0000000
--- a/src/newsreader/scss/components/form/_rule-form.scss
+++ /dev/null
@@ -1,25 +0,0 @@
-.rule-form {
- margin: 20px 0;
-
- &__section:last-child {
- & .rule-form__fieldset {
- display: flex;
- flex-direction: row;
- justify-content: space-between;
- }
- }
-
- #id_category {
- width: 50%;
-
- padding: 0 10px;
- }
-
- #id_timezone {
- max-height: 200px;
- width: 50%;
-
- margin: 0 15px;
- padding: 0 10px;
- }
-}
diff --git a/src/newsreader/scss/components/form/_settings-form.scss b/src/newsreader/scss/components/form/_settings-form.scss
deleted file mode 100644
index fc38d70..0000000
--- a/src/newsreader/scss/components/form/_settings-form.scss
+++ /dev/null
@@ -1,9 +0,0 @@
-.settings-form {
- &__section:last-child {
- & .settings-form__fieldset {
- display: flex;
- flex-direction: row;
- justify-content: space-between;
- }
- }
-}
diff --git a/src/newsreader/scss/components/form/index.scss b/src/newsreader/scss/components/form/index.scss
index 1555ae9..8069223 100644
--- a/src/newsreader/scss/components/form/index.scss
+++ b/src/newsreader/scss/components/form/index.scss
@@ -1,15 +1,3 @@
@import "form";
-@import "category-form";
-@import "rule-form";
@import "rules-form";
-@import "import-form";
-
-@import "login-form";
-@import "activation-form";
-@import "register-form";
-
-@import "password-reset-form";
-@import "password-reset-confirm-form";
-
-@import "settings-form";
diff --git a/src/newsreader/scss/elements/index.scss b/src/newsreader/scss/elements/index.scss
index f0d7be3..3e2a01c 100644
--- a/src/newsreader/scss/elements/index.scss
+++ b/src/newsreader/scss/elements/index.scss
@@ -1,10 +1,11 @@
+@import "badge/index";
@import "button/index";
+@import "help-text/index";
+@import "input/index";
+@import "label/index";
@import "link/index";
@import "h1/index";
@import "h2/index";
@import "h3/index";
@import "small/index";
-@import "input/index";
-@import "label/index";
-@import "help-text/index";
-@import "badge/index";
+@import "select/index";
diff --git a/src/newsreader/scss/elements/input/_input.scss b/src/newsreader/scss/elements/input/_input.scss
index 1cfb4bb..897fbf9 100644
--- a/src/newsreader/scss/elements/input/_input.scss
+++ b/src/newsreader/scss/elements/input/_input.scss
@@ -8,6 +8,15 @@
&:focus {
border: 1px $focus-blue solid;
}
+
+ &[type="file"] {
+ width: 40%;
+ }
+
+ &[type="checkbox"] {
+ align-self: flex-start;
+ margin: 0 0 0 10px;
+ }
}
input {
diff --git a/src/newsreader/scss/elements/select/_select.scss b/src/newsreader/scss/elements/select/_select.scss
new file mode 100644
index 0000000..d8737b4
--- /dev/null
+++ b/src/newsreader/scss/elements/select/_select.scss
@@ -0,0 +1,13 @@
+.select {
+ max-height: 200px;
+
+ &:not([size]){
+ width: 40%;
+ }
+
+ padding: 0 15px;
+}
+
+select {
+ @extend .select;
+}
diff --git a/src/newsreader/scss/elements/select/index.scss b/src/newsreader/scss/elements/select/index.scss
new file mode 100644
index 0000000..8320088
--- /dev/null
+++ b/src/newsreader/scss/elements/select/index.scss
@@ -0,0 +1 @@
+@import "select";
diff --git a/src/newsreader/scss/pages/login/index.scss b/src/newsreader/scss/pages/login/index.scss
index 69b946e..82b9457 100644
--- a/src/newsreader/scss/pages/login/index.scss
+++ b/src/newsreader/scss/pages/login/index.scss
@@ -3,4 +3,29 @@
width: 50%;
border-radius: 4px;
+
+ & .form {
+ @extend .form;
+
+ width: 100%;
+
+ h4 {
+ margin: 0;
+ padding: 20px 24px 5px 24px;
+ }
+
+ &__section {
+ &--last {
+ flex-direction: row-reverse;
+ justify-content: space-between;
+ }
+ }
+
+ &__fieldset {
+ @extend .form__fieldset;
+
+ &--last {
+ }
+ }
+ }
}
diff --git a/src/newsreader/templates/components/card/card.html b/src/newsreader/templates/components/card/card.html
new file mode 100644
index 0000000..750bd06
--- /dev/null
+++ b/src/newsreader/templates/components/card/card.html
@@ -0,0 +1,13 @@
+
+ {% if header_text %}
+ {% include "components/card/header.html" %}
+ {% endif %}
+
+ {% if content %}
+ {% include "components/card/content.html" %}
+ {% endif %}
+
+ {% if footer_text %}
+ {% include "components/card/footer.html" %}
+ {% endif %}
+
diff --git a/src/newsreader/templates/components/card/content.html b/src/newsreader/templates/components/card/content.html
new file mode 100644
index 0000000..8ae0141
--- /dev/null
+++ b/src/newsreader/templates/components/card/content.html
@@ -0,0 +1,3 @@
+
diff --git a/src/newsreader/templates/components/card/footer.html b/src/newsreader/templates/components/card/footer.html
new file mode 100644
index 0000000..1acffe0
--- /dev/null
+++ b/src/newsreader/templates/components/card/footer.html
@@ -0,0 +1,3 @@
+
diff --git a/src/newsreader/templates/components/card/header.html b/src/newsreader/templates/components/card/header.html
new file mode 100644
index 0000000..567756a
--- /dev/null
+++ b/src/newsreader/templates/components/card/header.html
@@ -0,0 +1,3 @@
+
diff --git a/src/newsreader/templates/components/form/cancel-button.html b/src/newsreader/templates/components/form/cancel-button.html
new file mode 100644
index 0000000..0891136
--- /dev/null
+++ b/src/newsreader/templates/components/form/cancel-button.html
@@ -0,0 +1,5 @@
+{% load i18n %}
+
+{% if cancel_url %}
+ {% trans "Cancel" %}
+{% endif %}
diff --git a/src/newsreader/templates/components/form/confirm-button.html b/src/newsreader/templates/components/form/confirm-button.html
new file mode 100644
index 0000000..e18b560
--- /dev/null
+++ b/src/newsreader/templates/components/form/confirm-button.html
@@ -0,0 +1,9 @@
+{% load i18n %}
+
+
+ {% if confirm_text %}
+ {{ confirm_text }}
+ {% else %}
+ {% trans "Save" %}
+ {% endif %}
+
diff --git a/src/newsreader/templates/components/form/errors.html b/src/newsreader/templates/components/form/errors.html
new file mode 100644
index 0000000..eed67f5
--- /dev/null
+++ b/src/newsreader/templates/components/form/errors.html
@@ -0,0 +1,3 @@
+
diff --git a/src/newsreader/templates/components/form/form.html b/src/newsreader/templates/components/form/form.html
new file mode 100644
index 0000000..d854eb1
--- /dev/null
+++ b/src/newsreader/templates/components/form/form.html
@@ -0,0 +1,43 @@
+{% load i18n %}
+
+
diff --git a/src/newsreader/templates/components/form/help-text.html b/src/newsreader/templates/components/form/help-text.html
new file mode 100644
index 0000000..eb02d82
--- /dev/null
+++ b/src/newsreader/templates/components/form/help-text.html
@@ -0,0 +1 @@
+{{ field.help_text }}
diff --git a/src/newsreader/templates/components/form/label.html b/src/newsreader/templates/components/form/label.html
new file mode 100644
index 0000000..4058b29
--- /dev/null
+++ b/src/newsreader/templates/components/form/label.html
@@ -0,0 +1,3 @@
+
+ {{ field.label }}
+
diff --git a/src/newsreader/templates/components/form/title.html b/src/newsreader/templates/components/form/title.html
new file mode 100644
index 0000000..3adcb75
--- /dev/null
+++ b/src/newsreader/templates/components/form/title.html
@@ -0,0 +1,3 @@
+
diff --git a/src/newsreader/templates/password-reset/password-reset-complete.html b/src/newsreader/templates/password-reset/password-reset-complete.html
new file mode 100755
index 0000000..0b7796f
--- /dev/null
+++ b/src/newsreader/templates/password-reset/password-reset-complete.html
@@ -0,0 +1,13 @@
+{% extends "base.html" %}
+{% load i18n %}
+
+{% block content %}
+
+ {% trans "Password reset complete" as header_text %}
+ {% blocktrans asvar content %}
+ You may now log in
+ {% endblocktrans %}
+
+ {% include "components/card/card.html" with header_text=header_text content=content %}
+
+{% endblock %}
diff --git a/src/newsreader/templates/password-reset/password-reset-confirm.html b/src/newsreader/templates/password-reset/password-reset-confirm.html
new file mode 100755
index 0000000..d0d5037
--- /dev/null
+++ b/src/newsreader/templates/password-reset/password-reset-confirm.html
@@ -0,0 +1,30 @@
+{% extends "base.html" %}
+{% load i18n %}
+
+{% block meta %}
+
+
+{% endblock %}
+
+{% block content %}
+
+ {% if validlink %}
+ {% url 'accounts:login' as cancel_url %}
+ {% trans "Enter your new password below to reset your password:" as title %}
+ {% trans "Change password" as confirm_text %}
+ {% include "components/form/form.html" with form=form title=title confirm_text=confirm_text cancel_url=cancel_url %}
+ {% else %}
+ {% trans "Password reset unsuccessful" as header_text %}
+ {% url 'accounts:password-reset' as reset_url %}
+ {% blocktrans asvar content %}
+ Password reset unsuccessful. Please
+ try again.
+ {% endblocktrans %}
+
+ {% include "components/card/card.html" with header_text=header_text content=content %}
+ {% endif %}
+
+{% endblock %}
+
+{# This is used by django.contrib.auth #}
diff --git a/src/newsreader/templates/password-reset/password-reset-done.html b/src/newsreader/templates/password-reset/password-reset-done.html
new file mode 100755
index 0000000..7012439
--- /dev/null
+++ b/src/newsreader/templates/password-reset/password-reset-done.html
@@ -0,0 +1,16 @@
+{% extends "base.html" %}
+{% load static i18n %}
+
+{% block title %}{% trans "Password reset" %}{% endblock %}
+
+{% block content %}
+
+ {% trans "Password reset" as header_text %}
+ {% blocktrans asvar content %}
+ We have sent you an email with a link to reset your password. Please check
+ your email and click the link to continue.
+ {% endblocktrans %}
+
+ {% include "components/card/card.html" with header_text=header_text content=content %}
+
+{% endblock %}
diff --git a/src/newsreader/templates/password-reset/password_reset_email.html b/src/newsreader/templates/password-reset/password-reset-email.html
similarity index 100%
rename from src/newsreader/templates/password-reset/password_reset_email.html
rename to src/newsreader/templates/password-reset/password-reset-email.html
diff --git a/src/newsreader/templates/password-reset/password-reset-form.html b/src/newsreader/templates/password-reset/password-reset-form.html
new file mode 100644
index 0000000..e423560
--- /dev/null
+++ b/src/newsreader/templates/password-reset/password-reset-form.html
@@ -0,0 +1,11 @@
+{% extends "components/form/form.html" %}
+{% load i18n %}
+
+{% block intro %}
+
+ {% blocktrans %}
+ Forgot your password? Enter your email in the form below and we'll send you
+ instructions for creating a new one.
+ {% endblocktrans %}
+
+{% endblock intro %}
diff --git a/src/newsreader/templates/password-reset/password_reset_subject.txt b/src/newsreader/templates/password-reset/password-reset-subject.txt
similarity index 100%
rename from src/newsreader/templates/password-reset/password_reset_subject.txt
rename to src/newsreader/templates/password-reset/password-reset-subject.txt
diff --git a/src/newsreader/templates/password-reset/password-reset.html b/src/newsreader/templates/password-reset/password-reset.html
new file mode 100644
index 0000000..97e5678
--- /dev/null
+++ b/src/newsreader/templates/password-reset/password-reset.html
@@ -0,0 +1,7 @@
+{% extends "base.html" %}
+
+{% block content %}
+
+ {% include "password-reset/password-reset-form.html" with form=form title="Reset password" confirm_text="Reset password" %}
+
+{% endblock %}
diff --git a/src/newsreader/templates/password-reset/password_reset_complete.html b/src/newsreader/templates/password-reset/password_reset_complete.html
deleted file mode 100755
index 8a47f55..0000000
--- a/src/newsreader/templates/password-reset/password_reset_complete.html
+++ /dev/null
@@ -1,23 +0,0 @@
-{% extends "base.html" %}
-{% load static i18n %}
-
-{% block title %}{% trans "Password reset complete" %}{% endblock %}
-
-{% block content %}
-
-
-
-
-
- {% trans "Your password has been reset!" %}
- {% blocktrans %}
- You may now log in
- {% endblocktrans %}.
-
-
-
-
-
-{% endblock %}
diff --git a/src/newsreader/templates/password-reset/password_reset_confirm.html b/src/newsreader/templates/password-reset/password_reset_confirm.html
deleted file mode 100755
index c438971..0000000
--- a/src/newsreader/templates/password-reset/password_reset_confirm.html
+++ /dev/null
@@ -1,55 +0,0 @@
-{% extends "base.html" %}
-{% load static i18n %}
-
-{% block meta %}
-
-
-{% endblock %}
-
-{% block title %}{% trans "Confirm password reset" %}{% endblock %}
-
-{% block content %}
-
-
- {% if validlink %}
-
-
- {% else %}
-
-
-
-
- {% url 'accounts:password-reset' as reset_url %}
- {% blocktrans %}
- Password reset unsuccessful. Please
- try again.
- {% endblocktrans %}
-
-
-
-
- {% endif %}
-
-
-{% endblock %}
-
-
-{# This is used by django.contrib.auth #}
diff --git a/src/newsreader/templates/password-reset/password_reset_done.html b/src/newsreader/templates/password-reset/password_reset_done.html
deleted file mode 100755
index dfa141c..0000000
--- a/src/newsreader/templates/password-reset/password_reset_done.html
+++ /dev/null
@@ -1,23 +0,0 @@
-{% extends "base.html" %}
-{% load static i18n %}
-
-{% block title %}{% trans "Password reset" %}{% endblock %}
-
-{% block content %}
-
-
-
-
-
- {% blocktrans %}
- We have sent you an email with a link to reset your password. Please check
- your email and click the link to continue.
- {% endblocktrans %}
-
-
-
-
-
-{% endblock %}
diff --git a/src/newsreader/templates/password-reset/password_reset_form.html b/src/newsreader/templates/password-reset/password_reset_form.html
deleted file mode 100755
index cd5fc3e..0000000
--- a/src/newsreader/templates/password-reset/password_reset_form.html
+++ /dev/null
@@ -1,30 +0,0 @@
-{% extends "base.html" %}
-{% load static i18n %}
-
-{% block title %}{% trans "Reset password" %}{% endblock %}
-
-{% block content %}
-
-
-
-{% endblock %}
diff --git a/src/newsreader/templates/registration/activation_complete.html b/src/newsreader/templates/registration/activation_complete.html
index 61ea493..f8dd91b 100755
--- a/src/newsreader/templates/registration/activation_complete.html
+++ b/src/newsreader/templates/registration/activation_complete.html
@@ -1,7 +1,5 @@
{% extends "base.html" %}
-{% load static i18n %}
-
-{% block title %}{% trans "Account Activated" %}{% endblock %}
+{% load i18n %}
{% comment %}
**registration/activation_complete.html**
@@ -13,19 +11,14 @@ account is now active.
{% block content %}
-
-
-
-
- {% trans "Your account is now activated." %}
- {% if not user.is_authenticated %}
- {% trans "You can log in." %}
- {% endif %}
-
-
-
-
+ {% trans "Account activated" as header_text %}
+
+ {% if user.is_authenticated %}
+ {% trans "Your account is activated. You can now log in." as content %}
+ {% else %}
+ {% trans "Your account is activated." as content %}
+ {% endif %}
+
+ {% include "components/card/card.html" with header_text=header_text content=content %}
{% endblock %}
diff --git a/src/newsreader/templates/registration/activation_email.html b/src/newsreader/templates/registration/activation_email.html
index 8be4421..8773b29 100644
--- a/src/newsreader/templates/registration/activation_email.html
+++ b/src/newsreader/templates/registration/activation_email.html
@@ -68,5 +68,5 @@ following context:
``HttpRequest`` instance for better flexibility.
For example it can be used to compute absolute register URL:
- {{ request.scheme }}://{{ request.get_host }}{% url 'registration_activate' activation_key %}
+ {{ request.scheme }}://{{ request.get_host }}{% url 'accounts:activate' activation_key %}
{% endcomment %}
diff --git a/src/newsreader/templates/registration/activation_email.txt b/src/newsreader/templates/registration/activation_email.txt
index 7f52a60..d07e785 100644
--- a/src/newsreader/templates/registration/activation_email.txt
+++ b/src/newsreader/templates/registration/activation_email.txt
@@ -48,5 +48,5 @@ following context:
``HttpRequest`` instance for better flexibility.
For example it can be used to compute absolute register URL:
- {{ request.scheme }}://{{ request.get_host }}{% url 'registration_activate' activation_key %}
+ {{ request.scheme }}://{{ request.get_host }}{% url 'accounts:activate' activation_key %}
{% endcomment %}
diff --git a/src/newsreader/templates/registration/activation_failure.html b/src/newsreader/templates/registration/activation_failure.html
index 5cf0f67..c99cc34 100644
--- a/src/newsreader/templates/registration/activation_failure.html
+++ b/src/newsreader/templates/registration/activation_failure.html
@@ -1,7 +1,5 @@
{% extends "base.html" %}
-{% load static i18n %}
-
-{% block title %}{% trans "Activation Failure" %}{% endblock %}
+{% load i18n %}
{% comment %}
**registration/activate.html**
@@ -14,14 +12,8 @@ Used if account activation fails. With the default setup, has the following cont
{% block content %}
-
-
-
-
{% trans "Account activation failed." %}
-
-
-
+ {% trans "Activation Failure" as header_text %}
+ {% trans "Account activation failed." as content %}
+ {% include "components/card/card.html" with header_text=header_text content=content %}
{% endblock %}
diff --git a/src/newsreader/templates/registration/activation_resend_complete.html b/src/newsreader/templates/registration/activation_resend_complete.html
index dcf1e79..6d01fee 100644
--- a/src/newsreader/templates/registration/activation_resend_complete.html
+++ b/src/newsreader/templates/registration/activation_resend_complete.html
@@ -14,18 +14,10 @@ the following context:
{% block content %}
-
-
-
-
- {% blocktrans %}
- We have sent an email to {{ email }} with further instructions.
- {% endblocktrans %}
-
-
-
-
+ {% trans "Account activation resent" as header_text %}
+ {% blocktrans asvar content %}
+ We have sent an email to {{ email }} with further instructions.
+ {% endblocktrans %}
+ {% include "components/card/card.html" with header_text=header_text content=content %}
{% endblock %}
diff --git a/src/newsreader/templates/registration/activation_resend_form.html b/src/newsreader/templates/registration/activation_resend_form.html
index f721242..5f0dd82 100644
--- a/src/newsreader/templates/registration/activation_resend_form.html
+++ b/src/newsreader/templates/registration/activation_resend_form.html
@@ -1,35 +1,9 @@
{% extends "base.html" %}
-{% load static i18n %}
-
-{% block title %}{% trans "Resend Activation Email" %}{% endblock %}
-
-{% comment %}
-**registration/resend_activation_form.html**
-Used to show the form users will fill out to resend the activation email. By
-default, has the following context:
-
-``form``
- The registration form. This will be an instance of some subclass
- of ``django.forms.Form``; consult `Django's forms documentation
- `_ for
- information on how to display this in a template.
-{% endcomment %}
+{% load static %}
{% block content %}
-
+ {% url "accounts:login" as cancel_url %}
+ {% include "components/form/form.html" with form=form title="Resend activation code" cancel_url=cancel_url confirm_text="Resend code" %}
{% endblock %}
diff --git a/src/newsreader/templates/registration/registration_closed.html b/src/newsreader/templates/registration/registration_closed.html
index 6169ebe..c7cfd9a 100755
--- a/src/newsreader/templates/registration/registration_closed.html
+++ b/src/newsreader/templates/registration/registration_closed.html
@@ -1,20 +1,10 @@
{% extends "base.html" %}
{% load static i18n %}
-{% block title %}{% trans "Registration is closed" %}{% endblock %}
-
{% block content %}
-
-
-
-
- {% trans "Sorry, but registration is closed at this moment. Come back later." %}
-
-
-
-
+ {% trans "Registration is closed" as header_text %}
+ {% trans "Sorry, but registration is closed at this moment. Come back later." as content %}
+ {% include "components/card/card.html" with header_text=header_text content=content %}
{% endblock %}
diff --git a/src/newsreader/templates/registration/registration_complete.html b/src/newsreader/templates/registration/registration_complete.html
index cc5f868..ccf70b2 100755
--- a/src/newsreader/templates/registration/registration_complete.html
+++ b/src/newsreader/templates/registration/registration_complete.html
@@ -1,7 +1,5 @@
{% extends "base.html" %}
-{% load static i18n %}
-
-{% block title %}{% trans "Activation email sent" %}{% endblock %}
+{% load i18n %}
{% comment %}
**registration/registration_complete.html**
@@ -14,16 +12,8 @@ been sent.
{% block content %}
-
-
-
-
- {% trans "Please check your email to complete the registration process." %}
-
-
-
-
+ {% trans "Activation email sent" as header_text %}
+ {% trans "Please check your email to complete the registration process." as content %}
+ {% include "components/card/card.html" with header_text=header_text content=content %}
{% endblock %}
diff --git a/src/newsreader/templates/registration/registration_form.html b/src/newsreader/templates/registration/registration_form.html
index 9b8619c..ccc07c9 100644
--- a/src/newsreader/templates/registration/registration_form.html
+++ b/src/newsreader/templates/registration/registration_form.html
@@ -1,22 +1,9 @@
{% extends "base.html" %}
-
{% load static %}
{% block content %}
-
+ {% url "accounts:login" as cancel_url %}
+ {% include "components/form/form.html" with form=form title="Register" cancel_url=cancel_url confirm_text="Register" %}
{% endblock %}