mirror of
https://github.com/mediacms-io/mediacms.git
synced 2025-11-19 21:26:05 -05:00
format content (#198)
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
from django.urls import reverse
|
||||
from django.conf import settings
|
||||
from allauth.account.adapter import DefaultAccountAdapter
|
||||
from django.conf import settings
|
||||
from django.core.exceptions import ValidationError
|
||||
from django.urls import reverse
|
||||
|
||||
|
||||
class MyAccountAdapter(DefaultAccountAdapter):
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
from django import forms
|
||||
from .models import User, Channel
|
||||
|
||||
from .models import Channel, User
|
||||
|
||||
|
||||
class SignupForm(forms.Form):
|
||||
@@ -23,7 +24,7 @@ class UserForm(forms.ModelForm):
|
||||
"advancedUser",
|
||||
"is_manager",
|
||||
"is_editor",
|
||||
#"allow_contact",
|
||||
# "allow_contact",
|
||||
)
|
||||
|
||||
def clean_logo(self):
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
# Generated by Django 3.1.4 on 2020-12-01 07:12
|
||||
|
||||
from django.conf import settings
|
||||
import django.contrib.auth.models
|
||||
import django.contrib.auth.validators
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
import django.utils.timezone
|
||||
import imagekit.models.fields
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
@@ -33,9 +33,7 @@ class Migration(migrations.Migration):
|
||||
("password", models.CharField(max_length=128, verbose_name="password")),
|
||||
(
|
||||
"last_login",
|
||||
models.DateTimeField(
|
||||
blank=True, null=True, verbose_name="last login"
|
||||
),
|
||||
models.DateTimeField(blank=True, null=True, verbose_name="last login"),
|
||||
),
|
||||
(
|
||||
"is_superuser",
|
||||
@@ -48,35 +46,25 @@ class Migration(migrations.Migration):
|
||||
(
|
||||
"username",
|
||||
models.CharField(
|
||||
error_messages={
|
||||
"unique": "A user with that username already exists."
|
||||
},
|
||||
error_messages={"unique": "A user with that username already exists."},
|
||||
help_text="Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.",
|
||||
max_length=150,
|
||||
unique=True,
|
||||
validators=[
|
||||
django.contrib.auth.validators.UnicodeUsernameValidator()
|
||||
],
|
||||
validators=[django.contrib.auth.validators.UnicodeUsernameValidator()],
|
||||
verbose_name="username",
|
||||
),
|
||||
),
|
||||
(
|
||||
"first_name",
|
||||
models.CharField(
|
||||
blank=True, max_length=150, verbose_name="first name"
|
||||
),
|
||||
models.CharField(blank=True, max_length=150, verbose_name="first name"),
|
||||
),
|
||||
(
|
||||
"last_name",
|
||||
models.CharField(
|
||||
blank=True, max_length=150, verbose_name="last name"
|
||||
),
|
||||
models.CharField(blank=True, max_length=150, verbose_name="last name"),
|
||||
),
|
||||
(
|
||||
"email",
|
||||
models.EmailField(
|
||||
blank=True, max_length=254, verbose_name="email address"
|
||||
),
|
||||
models.EmailField(blank=True, max_length=254, verbose_name="email address"),
|
||||
),
|
||||
(
|
||||
"is_staff",
|
||||
@@ -96,9 +84,7 @@ class Migration(migrations.Migration):
|
||||
),
|
||||
(
|
||||
"date_joined",
|
||||
models.DateTimeField(
|
||||
default=django.utils.timezone.now, verbose_name="date joined"
|
||||
),
|
||||
models.DateTimeField(default=django.utils.timezone.now, verbose_name="date joined"),
|
||||
),
|
||||
(
|
||||
"logo",
|
||||
@@ -111,9 +97,7 @@ class Migration(migrations.Migration):
|
||||
("description", models.TextField(blank=True, verbose_name="About me")),
|
||||
(
|
||||
"name",
|
||||
models.CharField(
|
||||
db_index=True, max_length=250, verbose_name="full name"
|
||||
),
|
||||
models.CharField(db_index=True, max_length=250, verbose_name="full name"),
|
||||
),
|
||||
(
|
||||
"date_added",
|
||||
@@ -125,9 +109,7 @@ class Migration(migrations.Migration):
|
||||
),
|
||||
(
|
||||
"is_featured",
|
||||
models.BooleanField(
|
||||
db_index=True, default=False, verbose_name="Is featured"
|
||||
),
|
||||
models.BooleanField(db_index=True, default=False, verbose_name="Is featured"),
|
||||
),
|
||||
(
|
||||
"title",
|
||||
@@ -135,9 +117,7 @@ class Migration(migrations.Migration):
|
||||
),
|
||||
(
|
||||
"advancedUser",
|
||||
models.BooleanField(
|
||||
db_index=True, default=False, verbose_name="advanced user"
|
||||
),
|
||||
models.BooleanField(db_index=True, default=False, verbose_name="advanced user"),
|
||||
),
|
||||
("media_count", models.IntegerField(default=0)),
|
||||
(
|
||||
@@ -156,21 +136,15 @@ class Migration(migrations.Migration):
|
||||
),
|
||||
(
|
||||
"location",
|
||||
models.CharField(
|
||||
blank=True, max_length=250, verbose_name="Location"
|
||||
),
|
||||
models.CharField(blank=True, max_length=250, verbose_name="Location"),
|
||||
),
|
||||
(
|
||||
"is_editor",
|
||||
models.BooleanField(
|
||||
db_index=True, default=False, verbose_name="MediaCMS Editor"
|
||||
),
|
||||
models.BooleanField(db_index=True, default=False, verbose_name="MediaCMS Editor"),
|
||||
),
|
||||
(
|
||||
"is_manager",
|
||||
models.BooleanField(
|
||||
db_index=True, default=False, verbose_name="MediaCMS Manager"
|
||||
),
|
||||
models.BooleanField(db_index=True, default=False, verbose_name="MediaCMS Manager"),
|
||||
),
|
||||
(
|
||||
"groups",
|
||||
@@ -218,9 +192,7 @@ class Migration(migrations.Migration):
|
||||
("notify", models.BooleanField(default=False)),
|
||||
(
|
||||
"method",
|
||||
models.CharField(
|
||||
choices=[("email", "Email")], default="email", max_length=20
|
||||
),
|
||||
models.CharField(choices=[("email", "Email")], default="email", max_length=20),
|
||||
),
|
||||
(
|
||||
"user",
|
||||
@@ -276,8 +248,6 @@ class Migration(migrations.Migration):
|
||||
),
|
||||
migrations.AddIndex(
|
||||
model_name="user",
|
||||
index=models.Index(
|
||||
fields=["-date_added", "name"], name="users_user_date_ad_4eb0b8_idx"
|
||||
),
|
||||
index=models.Index(fields=["-date_added", "name"], name="users_user_date_ad_4eb0b8_idx"),
|
||||
),
|
||||
]
|
||||
|
||||
@@ -1,18 +1,17 @@
|
||||
from django.db import models
|
||||
from django.conf import settings
|
||||
from django.contrib.auth.models import AbstractUser
|
||||
from django.utils import timezone
|
||||
from django.urls import reverse
|
||||
from django.dispatch import receiver
|
||||
from django.db.models.signals import post_save, post_delete
|
||||
from django.utils.html import strip_tags
|
||||
from django.core.mail import EmailMessage
|
||||
|
||||
from imagekit.processors import ResizeToFill
|
||||
from django.db import models
|
||||
from django.db.models.signals import post_delete, post_save
|
||||
from django.dispatch import receiver
|
||||
from django.urls import reverse
|
||||
from django.utils import timezone
|
||||
from django.utils.html import strip_tags
|
||||
from imagekit.models import ProcessedImageField
|
||||
from imagekit.processors import ResizeToFill
|
||||
|
||||
import files.helpers as helpers
|
||||
from files.models import Media, Tag, Category
|
||||
from files.models import Category, Media, Tag
|
||||
|
||||
|
||||
class User(AbstractUser):
|
||||
@@ -40,9 +39,7 @@ class User(AbstractUser):
|
||||
location = models.CharField("Location", max_length=250, blank=True)
|
||||
is_editor = models.BooleanField("MediaCMS Editor", default=False, db_index=True)
|
||||
is_manager = models.BooleanField("MediaCMS Manager", default=False, db_index=True)
|
||||
allow_contact = models.BooleanField(
|
||||
"Whether allow contact will be shown on profile page", default=False
|
||||
)
|
||||
allow_contact = models.BooleanField("Whether allow contact will be shown on profile page", default=False)
|
||||
|
||||
class Meta:
|
||||
ordering = ["-date_added", "name"]
|
||||
@@ -117,9 +114,7 @@ class User(AbstractUser):
|
||||
class Channel(models.Model):
|
||||
title = models.CharField(max_length=90, db_index=True)
|
||||
description = models.TextField(blank=True, help_text="description")
|
||||
user = models.ForeignKey(
|
||||
User, on_delete=models.CASCADE, db_index=True, related_name="channels"
|
||||
)
|
||||
user = models.ForeignKey(User, on_delete=models.CASCADE, db_index=True, related_name="channels")
|
||||
add_date = models.DateTimeField(auto_now_add=True, db_index=True)
|
||||
subscribers = models.ManyToManyField(User, related_name="subscriptions", blank=True)
|
||||
friendly_token = models.CharField(blank=True, max_length=12)
|
||||
@@ -150,13 +145,9 @@ class Channel(models.Model):
|
||||
|
||||
def get_absolute_url(self, edit=False):
|
||||
if edit:
|
||||
return reverse(
|
||||
"edit_channel", kwargs={"friendly_token": self.friendly_token}
|
||||
)
|
||||
return reverse("edit_channel", kwargs={"friendly_token": self.friendly_token})
|
||||
else:
|
||||
return reverse(
|
||||
"view_channel", kwargs={"friendly_token": self.friendly_token}
|
||||
)
|
||||
return reverse("view_channel", kwargs={"friendly_token": self.friendly_token})
|
||||
|
||||
@property
|
||||
def edit_url(self):
|
||||
@@ -178,9 +169,7 @@ Visit user profile page at %s
|
||||
instance.email,
|
||||
settings.SSL_FRONTEND_HOST + instance.get_absolute_url(),
|
||||
)
|
||||
email = EmailMessage(
|
||||
title, msg, settings.DEFAULT_FROM_EMAIL, settings.ADMIN_EMAIL_LIST
|
||||
)
|
||||
email = EmailMessage(title, msg, settings.DEFAULT_FROM_EMAIL, settings.ADMIN_EMAIL_LIST)
|
||||
email.send(fail_silently=True)
|
||||
|
||||
|
||||
@@ -193,14 +182,10 @@ class Notification(models.Model):
|
||||
Needs work
|
||||
"""
|
||||
|
||||
user = models.ForeignKey(
|
||||
User, on_delete=models.CASCADE, db_index=True, related_name="notifications"
|
||||
)
|
||||
user = models.ForeignKey(User, on_delete=models.CASCADE, db_index=True, related_name="notifications")
|
||||
action = models.CharField(max_length=30, blank=True)
|
||||
notify = models.BooleanField(default=False)
|
||||
method = models.CharField(
|
||||
max_length=20, choices=NOTIFICATION_METHODS, default="email"
|
||||
)
|
||||
method = models.CharField(max_length=20, choices=NOTIFICATION_METHODS, default="email")
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
super(Notification, self).save(*args, **kwargs)
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
from rest_framework import serializers
|
||||
|
||||
from .models import User
|
||||
|
||||
|
||||
@@ -11,9 +12,7 @@ class UserSerializer(serializers.ModelSerializer):
|
||||
return self.context["request"].build_absolute_uri(obj.get_absolute_url())
|
||||
|
||||
def get_api_url(self, obj):
|
||||
return self.context["request"].build_absolute_uri(
|
||||
obj.get_absolute_url(api=True)
|
||||
)
|
||||
return self.context["request"].build_absolute_uri(obj.get_absolute_url(api=True))
|
||||
|
||||
def get_thumbnail_url(self, obj):
|
||||
return self.context["request"].build_absolute_uri(obj.thumbnail_url())
|
||||
@@ -55,9 +54,7 @@ class UserDetailSerializer(serializers.ModelSerializer):
|
||||
return self.context["request"].build_absolute_uri(obj.get_absolute_url())
|
||||
|
||||
def get_api_url(self, obj):
|
||||
return self.context["request"].build_absolute_uri(
|
||||
obj.get_absolute_url(api=True)
|
||||
)
|
||||
return self.context["request"].build_absolute_uri(obj.get_absolute_url(api=True))
|
||||
|
||||
def get_thumbnail_url(self, obj):
|
||||
return self.context["request"].build_absolute_uri(obj.thumbnail_url())
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
from django.conf.urls import url
|
||||
|
||||
from . import views
|
||||
|
||||
urlpatterns = [
|
||||
@@ -20,9 +21,7 @@ urlpatterns = [
|
||||
name="get_user_about",
|
||||
),
|
||||
url(r"^user/(?P<username>[\w@.]*)/edit$", views.edit_user, name="edit_user"),
|
||||
url(
|
||||
r"^channel/(?P<friendly_token>[\w]*)$", views.view_channel, name="view_channel"
|
||||
),
|
||||
url(r"^channel/(?P<friendly_token>[\w]*)$", views.view_channel, name="view_channel"),
|
||||
url(
|
||||
r"^channel/(?P<friendly_token>[\w]*)/edit$",
|
||||
views.edit_channel,
|
||||
|
||||
@@ -8,10 +8,7 @@ from django.utils.translation import gettext_lazy as _
|
||||
@deconstructible
|
||||
class ASCIIUsernameValidator(validators.RegexValidator):
|
||||
regex = r"^[\w]+$"
|
||||
message = _(
|
||||
"Enter a valid username. This value may contain only "
|
||||
"English letters and numbers"
|
||||
)
|
||||
message = _("Enter a valid username. This value may contain only " "English letters and numbers")
|
||||
flags = re.ASCII
|
||||
|
||||
|
||||
|
||||
@@ -1,27 +1,27 @@
|
||||
from django.shortcuts import render
|
||||
from django.http import HttpResponseRedirect
|
||||
from django.conf import settings
|
||||
from django.contrib.auth.decorators import login_required
|
||||
from django.core.mail import EmailMessage
|
||||
from django.conf import settings
|
||||
|
||||
from rest_framework import permissions
|
||||
from rest_framework.views import APIView
|
||||
from rest_framework.response import Response
|
||||
from rest_framework.settings import api_settings
|
||||
from django.http import HttpResponseRedirect
|
||||
from django.shortcuts import render
|
||||
from rest_framework import permissions, status
|
||||
from rest_framework.decorators import api_view
|
||||
from rest_framework.exceptions import PermissionDenied
|
||||
from rest_framework import status
|
||||
from rest_framework.parsers import (
|
||||
JSONParser,
|
||||
MultiPartParser,
|
||||
FileUploadParser,
|
||||
FormParser,
|
||||
JSONParser,
|
||||
MultiPartParser,
|
||||
)
|
||||
from rest_framework.decorators import api_view
|
||||
from rest_framework.response import Response
|
||||
from rest_framework.settings import api_settings
|
||||
from rest_framework.views import APIView
|
||||
|
||||
from cms.permissions import IsUserOrManager
|
||||
from files.methods import is_mediacms_manager, is_mediacms_editor
|
||||
from .models import User, Channel
|
||||
from .forms import UserForm, ChannelForm
|
||||
from .serializers import UserSerializer, UserDetailSerializer
|
||||
from files.methods import is_mediacms_editor, is_mediacms_manager
|
||||
|
||||
from .forms import ChannelForm, UserForm
|
||||
from .models import Channel, User
|
||||
from .serializers import UserDetailSerializer, UserSerializer
|
||||
|
||||
|
||||
def get_user(username):
|
||||
@@ -38,15 +38,9 @@ def view_user(request, username):
|
||||
if not user:
|
||||
return HttpResponseRedirect("/members")
|
||||
context["user"] = user
|
||||
context["CAN_EDIT"] = (
|
||||
True
|
||||
if ((user and user == request.user) or is_mediacms_manager(request.user))
|
||||
else False
|
||||
)
|
||||
context["CAN_EDIT"] = True if ((user and user == request.user) or is_mediacms_manager(request.user)) else False
|
||||
context["CAN_DELETE"] = True if is_mediacms_manager(request.user) else False
|
||||
context["SHOW_CONTACT_FORM"] = (
|
||||
True if (user.allow_contact or is_mediacms_editor(request.user)) else False
|
||||
)
|
||||
context["SHOW_CONTACT_FORM"] = True if (user.allow_contact or is_mediacms_editor(request.user)) else False
|
||||
return render(request, "cms/user.html", context)
|
||||
|
||||
|
||||
@@ -57,15 +51,9 @@ def view_user_media(request, username):
|
||||
return HttpResponseRedirect("/members")
|
||||
|
||||
context["user"] = user
|
||||
context["CAN_EDIT"] = (
|
||||
True
|
||||
if ((user and user == request.user) or is_mediacms_manager(request.user))
|
||||
else False
|
||||
)
|
||||
context["CAN_EDIT"] = True if ((user and user == request.user) or is_mediacms_manager(request.user)) else False
|
||||
context["CAN_DELETE"] = True if is_mediacms_manager(request.user) else False
|
||||
context["SHOW_CONTACT_FORM"] = (
|
||||
True if (user.allow_contact or is_mediacms_editor(request.user)) else False
|
||||
)
|
||||
context["SHOW_CONTACT_FORM"] = True if (user.allow_contact or is_mediacms_editor(request.user)) else False
|
||||
return render(request, "cms/user_media.html", context)
|
||||
|
||||
|
||||
@@ -76,15 +64,9 @@ def view_user_playlists(request, username):
|
||||
return HttpResponseRedirect("/members")
|
||||
|
||||
context["user"] = user
|
||||
context["CAN_EDIT"] = (
|
||||
True
|
||||
if ((user and user == request.user) or is_mediacms_manager(request.user))
|
||||
else False
|
||||
)
|
||||
context["CAN_EDIT"] = True if ((user and user == request.user) or is_mediacms_manager(request.user)) else False
|
||||
context["CAN_DELETE"] = True if is_mediacms_manager(request.user) else False
|
||||
context["SHOW_CONTACT_FORM"] = (
|
||||
True if (user.allow_contact or is_mediacms_editor(request.user)) else False
|
||||
)
|
||||
context["SHOW_CONTACT_FORM"] = True if (user.allow_contact or is_mediacms_editor(request.user)) else False
|
||||
|
||||
return render(request, "cms/user_playlists.html", context)
|
||||
|
||||
@@ -96,15 +78,9 @@ def view_user_about(request, username):
|
||||
return HttpResponseRedirect("/members")
|
||||
|
||||
context["user"] = user
|
||||
context["CAN_EDIT"] = (
|
||||
True
|
||||
if ((user and user == request.user) or is_mediacms_manager(request.user))
|
||||
else False
|
||||
)
|
||||
context["CAN_EDIT"] = True if ((user and user == request.user) or is_mediacms_manager(request.user)) else False
|
||||
context["CAN_DELETE"] = True if is_mediacms_manager(request.user) else False
|
||||
context["SHOW_CONTACT_FORM"] = (
|
||||
True if (user.allow_contact or is_mediacms_editor(request.user)) else False
|
||||
)
|
||||
context["SHOW_CONTACT_FORM"] = True if (user.allow_contact or is_mediacms_editor(request.user)) else False
|
||||
|
||||
return render(request, "cms/user_about.html", context)
|
||||
|
||||
@@ -134,20 +110,14 @@ def view_channel(request, friendly_token):
|
||||
else:
|
||||
user = channel.user
|
||||
context["user"] = user
|
||||
context["CAN_EDIT"] = (
|
||||
True
|
||||
if ((user and user == request.user) or is_mediacms_manager(request.user))
|
||||
else False
|
||||
)
|
||||
context["CAN_EDIT"] = True if ((user and user == request.user) or is_mediacms_manager(request.user)) else False
|
||||
return render(request, "cms/channel.html", context)
|
||||
|
||||
|
||||
@login_required
|
||||
def edit_channel(request, friendly_token):
|
||||
channel = Channel.objects.filter(friendly_token=friendly_token).first()
|
||||
if not (
|
||||
channel and request.user.is_authenticated and (request.user == channel.user)
|
||||
):
|
||||
if not (channel and request.user.is_authenticated and (request.user == channel.user)):
|
||||
return HttpResponseRedirect("/")
|
||||
|
||||
if request.method == "POST":
|
||||
@@ -228,13 +198,9 @@ class UserDetail(APIView):
|
||||
self.check_object_permissions(self.request, user)
|
||||
return user
|
||||
except PermissionDenied:
|
||||
return Response(
|
||||
{"detail": "not enough permissions"}, status=status.HTTP_400_BAD_REQUEST
|
||||
)
|
||||
return Response({"detail": "not enough permissions"}, status=status.HTTP_400_BAD_REQUEST)
|
||||
except User.DoesNotExist:
|
||||
return Response(
|
||||
{"detail": "user does not exist"}, status=status.HTTP_400_BAD_REQUEST
|
||||
)
|
||||
return Response({"detail": "user does not exist"}, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
def get(self, request, username, format=None):
|
||||
# Get user details
|
||||
@@ -251,9 +217,7 @@ class UserDetail(APIView):
|
||||
if isinstance(user, Response):
|
||||
return user
|
||||
|
||||
serializer = UserDetailSerializer(
|
||||
user, data=request.data, context={"request": request}
|
||||
)
|
||||
serializer = UserDetailSerializer(user, data=request.data, context={"request": request})
|
||||
if serializer.is_valid():
|
||||
logo = request.data.get("logo")
|
||||
if logo:
|
||||
@@ -271,9 +235,7 @@ class UserDetail(APIView):
|
||||
return user
|
||||
|
||||
if not request.user.is_superuser:
|
||||
return Response(
|
||||
{"detail": "not allowed"}, status=status.HTTP_400_BAD_REQUEST
|
||||
)
|
||||
return Response({"detail": "not allowed"}, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
action = request.data.get("action")
|
||||
if action == "feature":
|
||||
|
||||
Reference in New Issue
Block a user