Add users
This commit is contained in:
parent
4c41dda244
commit
09ad44f247
13 changed files with 382 additions and 57 deletions
|
|
@ -4,6 +4,8 @@ from django.urls import URLPattern, path
|
|||
|
||||
from feeds import views
|
||||
|
||||
from .views import APIView, CustomLoginView, CustomLogoutView, ProfileView, RegisterView
|
||||
|
||||
app_name: str = "feeds"
|
||||
|
||||
urlpatterns: list[URLPattern] = [
|
||||
|
|
@ -11,4 +13,15 @@ urlpatterns: list[URLPattern] = [
|
|||
path(route="feed/<int:feed_id>/", view=views.FeedView.as_view(), name="feed"),
|
||||
path(route="feeds/", view=views.FeedsView.as_view(), name="feeds"),
|
||||
path(route="add", view=views.AddView.as_view(), name="add"),
|
||||
path(route="upload", view=views.UploadView.as_view(), name="upload"),
|
||||
path(route="api/", view=APIView.as_view(), name="api"),
|
||||
]
|
||||
|
||||
# Account urls
|
||||
urlpatterns += [
|
||||
path(route="accounts/login/", view=CustomLoginView.as_view(), name="login"),
|
||||
path(route="accounts/register/", view=RegisterView.as_view(), name="register"),
|
||||
path(route="accounts/logout/", view=CustomLogoutView.as_view(), name="logout"),
|
||||
# path(route="accounts/change-password/", view=CustomPasswordChangeView.as_view(), name="change_password"),
|
||||
path(route="accounts/profile/", view=ProfileView.as_view(), name="profile"),
|
||||
]
|
||||
|
|
|
|||
122
feeds/views.py
122
feeds/views.py
|
|
@ -1,16 +1,27 @@
|
|||
from __future__ import annotations
|
||||
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from django.contrib import messages
|
||||
from django.contrib.auth import login
|
||||
from django.contrib.auth.forms import AuthenticationForm, UserCreationForm
|
||||
from django.contrib.auth.views import LoginView, LogoutView, PasswordChangeView
|
||||
from django.contrib.messages.views import SuccessMessageMixin
|
||||
from django.http import HttpRequest, HttpResponse
|
||||
from django.shortcuts import get_object_or_404, render
|
||||
from django.template import loader
|
||||
from django.urls import reverse_lazy
|
||||
from django.views import View
|
||||
from django.views.generic.edit import CreateView
|
||||
from django.views.generic.list import ListView
|
||||
|
||||
from feeds.add_feeds import add_feed
|
||||
from feeds.models import Entry, Feed
|
||||
from feeds.stats import get_db_size
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from django.contrib.auth.models import User
|
||||
|
||||
|
||||
class IndexView(View):
|
||||
"""Index path."""
|
||||
|
|
@ -93,10 +104,6 @@ class AddView(View):
|
|||
|
||||
def post(self, request: HttpRequest) -> HttpResponse:
|
||||
"""Add a feed."""
|
||||
|
||||
# Temporary turn off the /add page.
|
||||
return HttpResponse(content="Not available", status=404)
|
||||
|
||||
urls: str | None = request.POST.get("urls", None)
|
||||
if not urls:
|
||||
return HttpResponse(content="No urls", status=400)
|
||||
|
|
@ -116,3 +123,110 @@ class AddView(View):
|
|||
# Render the index page.
|
||||
template = loader.get_template(template_name="index.html")
|
||||
return HttpResponse(content=template.render(context={}, request=request))
|
||||
|
||||
|
||||
class UploadView(View):
|
||||
"""Upload a file."""
|
||||
|
||||
def get(self, request: HttpRequest) -> HttpResponse:
|
||||
"""Load the index page."""
|
||||
template = loader.get_template(template_name="index.html")
|
||||
context = {
|
||||
"db_size": get_db_size(),
|
||||
"amount_of_feeds": Feed.objects.count(),
|
||||
"description": "FeedVault allows users to archive and search their favorite web feeds.",
|
||||
"keywords": "feed, rss, atom, archive, rss list",
|
||||
"author": "TheLovinator",
|
||||
"canonical": "https://feedvault.se/",
|
||||
}
|
||||
return HttpResponse(content=template.render(context=context, request=request))
|
||||
|
||||
def post(self, request: HttpRequest) -> HttpResponse:
|
||||
"""Upload a file."""
|
||||
file = request.FILES.get("file", None)
|
||||
if not file:
|
||||
return HttpResponse(content="No file", status=400)
|
||||
|
||||
# Split the urls by newline.
|
||||
for url in file.read().decode("utf-8").split("\n"):
|
||||
feed: None | Feed = add_feed(url)
|
||||
if not feed:
|
||||
messages.error(request, f"{url} - Failed to add")
|
||||
continue
|
||||
# Check if bozo is true.
|
||||
if feed.bozo:
|
||||
messages.warning(request, f"{feed.feed_url} - Bozo: {feed.bozo_exception}")
|
||||
|
||||
messages.success(request, f"{feed.feed_url} added")
|
||||
|
||||
# Render the index page.
|
||||
template = loader.get_template(template_name="index.html")
|
||||
return HttpResponse(content=template.render(context={}, request=request))
|
||||
|
||||
|
||||
class CustomLoginView(LoginView):
|
||||
"""Custom login view."""
|
||||
|
||||
template_name = "accounts/login.html"
|
||||
|
||||
def form_valid(self, form: AuthenticationForm) -> HttpResponse:
|
||||
"""Check if the form is valid."""
|
||||
user: User = form.get_user()
|
||||
login(self.request, user)
|
||||
return super().form_valid(form)
|
||||
|
||||
|
||||
class RegisterView(CreateView):
|
||||
"""Register view."""
|
||||
|
||||
template_name = "accounts/register.html"
|
||||
form_class = UserCreationForm
|
||||
success_url = reverse_lazy("feeds:login")
|
||||
|
||||
|
||||
class CustomLogoutView(LogoutView):
|
||||
"""Logout view."""
|
||||
|
||||
next_page = "feeds:index" # Redirect to index after logout
|
||||
|
||||
|
||||
class CustomPasswordChangeView(SuccessMessageMixin, PasswordChangeView):
|
||||
"""Custom password change view."""
|
||||
|
||||
template_name = "accounts/change_password.html"
|
||||
success_url = reverse_lazy("feeds:index")
|
||||
success_message = "Your password was successfully updated!"
|
||||
|
||||
|
||||
class ProfileView(View):
|
||||
"""Profile page."""
|
||||
|
||||
def get(self, request: HttpRequest) -> HttpResponse:
|
||||
"""Load the profile page."""
|
||||
template = loader.get_template(template_name="accounts/profile.html")
|
||||
context = {
|
||||
"db_size": get_db_size(),
|
||||
"amount_of_feeds": Feed.objects.count(),
|
||||
"description": "FeedVault allows users to archive and search their favorite web feeds.",
|
||||
"keywords": "feed, rss, atom, archive, rss list",
|
||||
"author": "TheLovinator",
|
||||
"canonical": "https://feedvault.se/",
|
||||
}
|
||||
return HttpResponse(content=template.render(context=context, request=request))
|
||||
|
||||
|
||||
class APIView(View):
|
||||
"""API documentation page."""
|
||||
|
||||
def get(self, request: HttpRequest) -> HttpResponse:
|
||||
"""Load the API page."""
|
||||
template = loader.get_template(template_name="api.html")
|
||||
context = {
|
||||
"db_size": get_db_size(),
|
||||
"amount_of_feeds": Feed.objects.count(),
|
||||
"description": "FeedVault allows users to archive and search their favorite web feeds.",
|
||||
"keywords": "feed, rss, atom, archive, rss list",
|
||||
"author": "TheLovinator",
|
||||
"canonical": "https://feedvault.se/api/",
|
||||
}
|
||||
return HttpResponse(content=template.render(context=context, request=request))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue