preference to append text when sharing; clean up duplicated code

This commit is contained in:
Your Name 2022-04-22 21:14:00 -04:00
parent 586583f198
commit f2ede0668c
18 changed files with 168 additions and 348 deletions

View file

@ -1,17 +1,12 @@
from django import forms
from django.utils.translation import gettext_lazy as _
from .models import Book, BookMark, BookReview
from .models import Book, BookMark, BookReview, BookMarkStatusTranslation
from common.models import MarkStatusEnum
from common.forms import *
def BookMarkStatusTranslator(status):
trans_dict = {
MarkStatusEnum.DO.value: _("在读"),
MarkStatusEnum.WISH.value: _("想读"),
MarkStatusEnum.COLLECT.value: _("读过")
}
return trans_dict[status]
return BookMarkStatusTranslation[status]
class BookForm(forms.ModelForm):

View file

@ -2,12 +2,19 @@ import django.contrib.postgres.fields as postgres
from django.utils.translation import gettext_lazy as _
from django.db import models
from django.shortcuts import reverse
from common.models import Entity, Mark, Review, Tag
from common.models import Entity, Mark, Review, Tag, MarkStatusEnum
from common.utils import GenerateDateUUIDMediaFilePath
from django.conf import settings
from django.db.models import Q
BookMarkStatusTranslation = {
MarkStatusEnum.DO.value: _("在读"),
MarkStatusEnum.WISH.value: _("想读"),
MarkStatusEnum.COLLECT.value: _("读过")
}
def book_cover_path(instance, filename):
return GenerateDateUUIDMediaFilePath(instance, filename, settings.BOOK_MEDIA_PATH_ROOT)
@ -115,7 +122,6 @@ class Book(Entity):
def mark_class(self):
return BookMark
class BookMark(Mark):
book = models.ForeignKey(
Book, on_delete=models.CASCADE, related_name='book_marks', null=True)
@ -126,6 +132,10 @@ class BookMark(Mark):
fields=['owner', 'book'], name="unique_book_mark")
]
@property
def translated_status(self):
return BookMarkStatusTranslation[self.status]
class BookReview(Review):
book = models.ForeignKey(
@ -137,6 +147,10 @@ class BookReview(Review):
fields=['owner', 'book'], name="unique_book_review")
]
@property
def url(self):
return settings.APP_WEBSITE + reverse("books:retrieve_review", args=[self.id])
class BookTag(Tag):
book = models.ForeignKey(

View file

@ -10,8 +10,7 @@ from django.utils import timezone
from django.core.paginator import Paginator
from mastodon import mastodon_request_included
from mastodon.models import MastodonApplication
from mastodon.api import post_toot, TootVisibilityEnum
from mastodon.utils import rating_to_emoji
from mastodon.api import share_mark, share_review
from common.utils import PageLinksGenerator
from common.views import PAGE_LINK_NUMBER, jump_or_scrape
from common.models import SourceSiteEnum
@ -306,26 +305,7 @@ def create_update_mark(request):
return HttpResponseServerError("integrity error")
if form.cleaned_data['share_to_mastodon']:
if form.cleaned_data['visibility'] == 2:
visibility = TootVisibilityEnum.DIRECT
elif form.cleaned_data['visibility'] == 1:
visibility = TootVisibilityEnum.PRIVATE
else:
visibility = TootVisibilityEnum.PUBLIC if request.user.preference.mastodon_publish_public else TootVisibilityEnum.UNLISTED
url = "https://" + request.get_host() + reverse("books:retrieve",
args=[book.id])
words = BookMarkStatusTranslator(form.cleaned_data['status']) +\
f"{book.title}" + \
rating_to_emoji(form.cleaned_data['rating'], MastodonApplication.objects.get(domain_name=request.user.mastodon_site).star_mode)
# tags = settings.MASTODON_TAGS % {'category': '书', 'type': '标记'}
tags = ''
content = words + '\n' + url + '\n' + \
form.cleaned_data['text'] + '\n' + tags
response = post_toot(
request.user.mastodon_site, content, visibility, request.user.mastodon_token)
if response.status_code != 200:
mastodon_logger.error(f"CODE:{response.status_code} {response.text}")
if not share_mark(form.instance):
return HttpResponseServerError("publishing mastodon status failed")
else:
return HttpResponseBadRequest(f"invalid form data {form.errors}")
@ -421,24 +401,7 @@ def create_review(request, book_id):
form.instance.owner = request.user
form.save()
if form.cleaned_data['share_to_mastodon']:
if form.cleaned_data['visibility'] == 2:
visibility = TootVisibilityEnum.DIRECT
elif form.cleaned_data['visibility'] == 1:
visibility = TootVisibilityEnum.PRIVATE
else:
visibility = TootVisibilityEnum.PUBLIC if request.user.preference.mastodon_publish_public else TootVisibilityEnum.UNLISTED
url = "https://" + request.get_host() + reverse("books:retrieve_review",
args=[form.instance.id])
words = "发布了关于" + f"{form.instance.book.title}" + "的评论"
# tags = settings.MASTODON_TAGS % {'category': '书', 'type': '评论'}
tags = ''
content = words + '\n' + url + \
'\n' + form.cleaned_data['title'] + '\n' + tags
response = post_toot(
request.user.mastodon_site, content, visibility, request.user.mastodon_token)
if response.status_code != 200:
mastodon_logger.error(
f"CODE:{response.status_code} {response.text}")
if not share_review(form.instance):
return HttpResponseServerError("publishing mastodon status failed")
return redirect(reverse("books:retrieve_review", args=[form.instance.id]))
else:
@ -475,23 +438,7 @@ def update_review(request, id):
form.instance.edited_time = timezone.now()
form.save()
if form.cleaned_data['share_to_mastodon']:
if form.cleaned_data['visibility'] == 2:
visibility = TootVisibilityEnum.DIRECT
elif form.cleaned_data['visibility'] == 1:
visibility = TootVisibilityEnum.PRIVATE
else:
visibility = TootVisibilityEnum.PUBLIC if request.user.preference.mastodon_publish_public else TootVisibilityEnum.UNLISTED
url = "https://" + request.get_host() + reverse("books:retrieve_review",
args=[form.instance.id])
words = "发布了关于" + f"{form.instance.book.title}" + "的评论"
# tags = settings.MASTODON_TAGS % {'category': '书', 'type': '评论'}
tags = ''
content = words + '\n' + url + \
'\n' + form.cleaned_data['title'] + '\n' + tags
response = post_toot(
request.user.mastodon_site, content, visibility, request.user.mastodon_token)
if response.status_code != 200:
mastodon_logger.error(f"CODE:{response.status_code} {response.text}")
if not share_review(form.instance):
return HttpResponseServerError("publishing mastodon status failed")
return redirect(reverse("books:retrieve_review", args=[form.instance.id]))
else:

View file

@ -11,7 +11,6 @@ from django.core.paginator import Paginator
from mastodon import mastodon_request_included
from mastodon.models import MastodonApplication
from mastodon.api import post_toot, TootVisibilityEnum
from mastodon.utils import rating_to_emoji
from common.utils import PageLinksGenerator
from common.views import PAGE_LINK_NUMBER, jump_or_scrape
from common.models import SourceSiteEnum

View file

@ -58,12 +58,16 @@ class Entity(models.Model):
def get_absolute_url(self):
raise NotImplementedError("Subclass should implement this method")
@property
def url(self):
return settings.APP_WEBSITE + self.get_absolute_url()
def get_json(self):
return {
'title': self.title,
'brief': self.brief,
'rating': self.rating,
'url': settings.APP_WEBSITE + self.get_absolute_url(),
'url': self.url,
'cover_url': settings.APP_WEBSITE + self.cover.url,
'top_tags': self.tags[:5],
'category_name': self.verbose_category_name,
@ -273,6 +277,10 @@ class Mark(UserOwnedEntity):
def __str__(self):
return f"Mark({self.id} {self.owner} {self.status.upper()})"
@property
def translated_status(self):
raise NotImplementedError("Subclass should implement this.")
class Meta:
abstract = True
constraints = [

View file

@ -1,18 +1,13 @@
from django import forms
from django.contrib.postgres.forms import SimpleArrayField
from django.utils.translation import gettext_lazy as _
from .models import Game, GameMark, GameReview
from .models import Game, GameMark, GameReview, GameMarkStatusTranslation
from common.models import MarkStatusEnum
from common.forms import *
def GameMarkStatusTranslator(status):
trans_dict = {
MarkStatusEnum.DO.value: _("在玩"),
MarkStatusEnum.WISH.value: _("想玩"),
MarkStatusEnum.COLLECT.value: _("玩过")
}
return trans_dict[status]
return GameMarkStatusTranslation[status]
class GameForm(forms.ModelForm):

View file

@ -4,12 +4,19 @@ from django.utils.translation import gettext_lazy as _
from django.db import models
from django.core.serializers.json import DjangoJSONEncoder
from django.shortcuts import reverse
from common.models import Entity, Mark, Review, Tag
from common.models import Entity, Mark, Review, Tag, MarkStatusEnum
from common.utils import ChoicesDictGenerator, GenerateDateUUIDMediaFilePath
from django.utils import timezone
from django.conf import settings
GameMarkStatusTranslation = {
MarkStatusEnum.DO.value: _("在玩"),
MarkStatusEnum.WISH.value: _("想玩"),
MarkStatusEnum.COLLECT.value: _("玩过")
}
def game_cover_path(instance, filename):
return GenerateDateUUIDMediaFilePath(instance, filename, settings.GAME_MEDIA_PATH_ROOT)
@ -112,6 +119,10 @@ class GameMark(Mark):
fields=['owner', 'game'], name='unique_game_mark')
]
@property
def translated_status(self):
return GameMarkStatusTranslation[self.status]
class GameReview(Review):
game = models.ForeignKey(
@ -123,6 +134,10 @@ class GameReview(Review):
fields=['owner', 'game'], name='unique_game_review')
]
@property
def url(self):
return settings.APP_WEBSITE + reverse("games:retrieve_review", args=[self.id])
class GameTag(Tag):
game = models.ForeignKey(

View file

@ -10,8 +10,7 @@ from django.utils import timezone
from django.core.paginator import Paginator
from mastodon import mastodon_request_included
from mastodon.models import MastodonApplication
from mastodon.api import post_toot, TootVisibilityEnum
from mastodon.utils import rating_to_emoji
from mastodon.api import share_mark, share_review
from common.utils import PageLinksGenerator
from common.views import PAGE_LINK_NUMBER, jump_or_scrape
from common.models import SourceSiteEnum
@ -308,27 +307,7 @@ def create_update_mark(request):
return HttpResponseServerError("integrity error")
if form.cleaned_data['share_to_mastodon']:
if form.cleaned_data['visibility'] == 2:
visibility = TootVisibilityEnum.DIRECT
elif form.cleaned_data['visibility'] == 1:
visibility = TootVisibilityEnum.PRIVATE
else:
visibility = TootVisibilityEnum.PUBLIC if request.user.preference.mastodon_publish_public else TootVisibilityEnum.UNLISTED
url = "https://" + request.get_host() + reverse("games:retrieve",
args=[game.id])
words = GameMarkStatusTranslator(form.cleaned_data['status']) +\
f"{game.title}" + \
rating_to_emoji(form.cleaned_data['rating'], MastodonApplication.objects.get(domain_name=request.user.mastodon_site).star_mode)
# tags = settings.MASTODON_TAGS % {'category': '书', 'type': '标记'}
tags = ''
content = words + '\n' + url + '\n' + \
form.cleaned_data['text'] + '\n' + tags
response = post_toot(request.user.mastodon_site, content, visibility,
request.user.mastodon_token)
if response.status_code != 200:
mastodon_logger.error(
f"CODE:{response.status_code} {response.text}")
if not share_mark(form.instance):
return HttpResponseServerError("publishing mastodon status failed")
else:
return HttpResponseBadRequest(f"invalid form data {form.errors}")
@ -424,24 +403,7 @@ def create_review(request, game_id):
form.instance.owner = request.user
form.save()
if form.cleaned_data['share_to_mastodon']:
if form.cleaned_data['visibility'] == 2:
visibility = TootVisibilityEnum.DIRECT
elif form.cleaned_data['visibility'] == 1:
visibility = TootVisibilityEnum.PRIVATE
else:
visibility = TootVisibilityEnum.PUBLIC if request.user.preference.mastodon_publish_public else TootVisibilityEnum.UNLISTED
url = "https://" + request.get_host() + reverse("games:retrieve_review",
args=[form.instance.id])
words = "发布了关于" + f"{form.instance.game.title}" + "的评论"
# tags = settings.MASTODON_TAGS % {'category': '书', 'type': '评论'}
tags = ''
content = words + '\n' + url + \
'\n' + form.cleaned_data['title'] + '\n' + tags
response = post_toot(request.user.mastodon_site, content, visibility,
request.user.mastodon_token)
if response.status_code != 200:
mastodon_logger.error(
f"CODE:{response.status_code} {response.text}")
if not share_review(form.instance):
return HttpResponseServerError("publishing mastodon status failed")
return redirect(reverse("games:retrieve_review", args=[form.instance.id]))
else:
@ -478,24 +440,7 @@ def update_review(request, id):
form.instance.edited_time = timezone.now()
form.save()
if form.cleaned_data['share_to_mastodon']:
if form.cleaned_data['visibility'] == 2:
visibility = TootVisibilityEnum.DIRECT
elif form.cleaned_data['visibility'] == 1:
visibility = TootVisibilityEnum.PRIVATE
else:
visibility = TootVisibilityEnum.PUBLIC if request.user.preference.mastodon_publish_public else TootVisibilityEnum.UNLISTED
url = "https://" + request.get_host() + reverse("games:retrieve_review",
args=[form.instance.id])
words = "发布了关于" + f"{form.instance.game.title}" + "的评论"
# tags = settings.MASTODON_TAGS % {'category': '书', 'type': '评论'}
tags = ''
content = words + '\n' + url + \
'\n' + form.cleaned_data['title'] + '\n' + tags
response = post_toot(request.user.mastodon_site, content, visibility,
request.user.mastodon_token)
if response.status_code != 200:
mastodon_logger.error(
f"CODE:{response.status_code} {response.text}")
if not share_review(form.instance):
return HttpResponseServerError("publishing mastodon status failed")
return redirect(reverse("games:retrieve_review", args=[form.instance.id]))
else:

View file

@ -2,11 +2,16 @@ import requests
import string
import random
import functools
import logging
from django.core.exceptions import ObjectDoesNotExist
from django.conf import settings
from django.shortcuts import reverse
from urllib.parse import quote
from .models import CrossSiteUserInfo, MastodonApplication
from mastodon.utils import rating_to_emoji
logger = logging.getLogger(__name__)
# See https://docs.joinmastodon.org/methods/accounts/
@ -94,6 +99,8 @@ def post_toot(site, content, visibility, token, local_only=False):
response = post(url, headers=headers, data=payload)
if response.status_code == 201:
response.status_code = 200
if response.status_code != 200:
logger.error(f"Error {url} {response.status_code} {response.text}")
return response
@ -187,7 +194,7 @@ def get_cross_site_id(target_user, target_site, token):
cross_site_id = get_site_id(
target_user.username, target_user.mastodon_site, target_site, token)
if not cross_site_id:
print(f'unable to find cross_site_id for {target_user} on {target_site}')
logger.error(f'unable to find cross_site_id for {target_user} on {target_site}')
return None
cross_site_info = CrossSiteUserInfo.objects.create(
uid=f"{target_user.username}@{target_user.mastodon_site}",
@ -210,9 +217,7 @@ def verify_account(site, token):
try:
response = get(url, headers={'User-Agent': 'NeoDB/1.0', 'Authorization': f'Bearer {token}'})
if response.status_code != 200:
print(url)
print(response.status_code)
print(response.text)
logger.error(f"Error {url} {response.status_code} {response.text}")
return response.status_code, None
r = response.json()['data']
r['display_name'] = r['name']
@ -274,13 +279,13 @@ def get_mastodon_application(domain):
# fill the form with returned data
if response.status_code != 200:
error_msg = "实例连接错误,代码: " + str(response.status_code)
print(f'Error connecting {domain}: {response.status_code} {response.content.decode("utf-8")}')
logger.error(f'Error connecting {domain}: {response.status_code} {response.content.decode("utf-8")}')
else:
try:
data = response.json()
except Exception as e:
error_msg = "实例返回内容无法识别"
print(f'Error connecting {domain}: {response.status_code} {response.content.decode("utf-8")} {e}')
logger.error(f'Error connecting {domain}: {response.status_code} {response.content.decode("utf-8")} {e}')
else:
app = MastodonApplication.objects.create(domain_name=domain, app_id=data['id'], client_id=data['client_id'],
client_secret=data['client_secret'], vapid_key=data['vapid_key'] if 'vapid_key' in data else '')
@ -320,9 +325,7 @@ def obtain_token(site, request, code):
response = post(url, data=payload, headers=headers, auth=auth)
# {"token_type":"bearer","expires_in":7200,"access_token":"VGpkOEZGR3FQRDJ5NkZ0dmYyYWIwS0dqeHpvTnk4eXp0NV9nWDJ2TEpmM1ZTOjE2NDg3ODMxNTU4Mzc6MToxOmF0OjE","scope":"block.read follows.read offline.access tweet.write users.read mute.read","refresh_token":"b1pXbGEzeUF1WE5yZHJOWmxTeWpvMTBrQmZPd0czLU0tQndZQTUyU3FwRDVIOjE2NDg3ODMxNTU4Mzg6MToxOnJ0OjE"}
if response.status_code != 200:
print(url)
print(response.status_code)
print(response.text)
logger.error(f"Error {url} {response.status_code} {response.text}")
return None, None
data = response.json()
return data.get('access_token'), data.get('refresh_token', '')
@ -342,10 +345,7 @@ def refresh_access_token(site, refresh_token):
auth = (mast_app.client_id, mast_app.client_secret)
response = post(url, data=payload, headers=headers, auth=auth)
if response.status_code != 200:
print(url)
print(payload)
print(response.status_code)
print(response.text)
logger.error(f"Error {url} {response.status_code} {response.text}")
return None
data = response.json()
return data.get('access_token')
@ -366,3 +366,35 @@ def revoke_token(site, token):
url = 'https://' + site + API_REVOKE_TOKEN
post(url, data=payload, headers={'User-Agent': 'NeoDB/1.0'})
def share_mark(mark):
user = mark.owner
if mark.visibility == 2:
visibility = TootVisibilityEnum.DIRECT
elif mark.visibility == 1:
visibility = TootVisibilityEnum.PRIVATE
elif user.preference.mastodon_publish_public:
visibility = TootVisibilityEnum.PUBLIC
else:
visibility = TootVisibilityEnum.UNLISTED
tags = '\n' + user.preference.mastodon_append_tag.replace('[category]', str(mark.item.verbose_category_name)) if user.preference.mastodon_append_tag else ''
stars = rating_to_emoji(mark.rating,MastodonApplication.objects.get(domain_name=user.mastodon_site).star_mode)
content = f"{mark.translated_status}{mark.item.title}{stars}\n{mark.item.url}\n{mark.text}{tags}"
response = post_toot(user.mastodon_site, content, visibility, user.mastodon_token)
return response.status_code == 200
def share_review(review):
user = review.owner
if review.visibility == 2:
visibility = TootVisibilityEnum.DIRECT
elif review.visibility == 1:
visibility = TootVisibilityEnum.PRIVATE
elif user.preference.mastodon_publish_public:
visibility = TootVisibilityEnum.PUBLIC
else:
visibility = TootVisibilityEnum.UNLISTED
tags = '\n' + user.preference.mastodon_append_tag.replace('[category]', str(review.item.verbose_category_name)) if user.preference.mastodon_append_tag else ''
content = f"发布了关于《{review.item.title}》的评论\n{review.url}\n{review.title}{tags}"
response = post_toot(user.mastodon_site, content, visibility, user.mastodon_token)
return response.status_code == 200

View file

@ -1,18 +1,13 @@
from django import forms
from django.contrib.postgres.forms import SimpleArrayField
from django.utils.translation import gettext_lazy as _
from .models import Movie, MovieMark, MovieReview, MovieGenreEnum
from .models import Movie, MovieMark, MovieReview, MovieGenreEnum, MovieMarkStatusTranslation
from common.models import MarkStatusEnum
from common.forms import *
def MovieMarkStatusTranslator(status):
trans_dict = {
MarkStatusEnum.DO.value: _("在看"),
MarkStatusEnum.WISH.value: _("想看"),
MarkStatusEnum.COLLECT.value: _("看过")
}
return trans_dict[status]
return MovieMarkStatusTranslation[status]
class MovieForm(forms.ModelForm):

View file

@ -4,7 +4,7 @@ from django.utils.translation import gettext_lazy as _
from django.db import models
from django.core.serializers.json import DjangoJSONEncoder
from django.shortcuts import reverse
from common.models import Entity, Mark, Review, Tag
from common.models import Entity, Mark, Review, Tag, MarkStatusEnum
from common.utils import ChoicesDictGenerator, GenerateDateUUIDMediaFilePath
from django.utils import timezone
from django.conf import settings
@ -12,6 +12,13 @@ from django.db.models import Q
import re
MovieMarkStatusTranslation = {
MarkStatusEnum.DO.value: _("在看"),
MarkStatusEnum.WISH.value: _("想看"),
MarkStatusEnum.COLLECT.value: _("看过")
}
def movie_cover_path(instance, filename):
return GenerateDateUUIDMediaFilePath(instance, filename, settings.MOVIE_MEDIA_PATH_ROOT)
@ -231,11 +238,16 @@ class Movie(Entity):
class MovieMark(Mark):
movie = models.ForeignKey(Movie, on_delete=models.CASCADE, related_name='movie_marks', null=True)
class Meta:
constraints = [
models.UniqueConstraint(fields=['owner', 'movie'], name='unique_movie_mark')
]
@property
def translated_status(self):
return MovieMarkStatusTranslation[self.status]
class MovieReview(Review):
movie = models.ForeignKey(Movie, on_delete=models.CASCADE, related_name='movie_reviews', null=True)
@ -245,6 +257,10 @@ class MovieReview(Review):
fields=['owner', 'movie'], name='unique_movie_review')
]
@property
def url(self):
return settings.APP_WEBSITE + reverse("movies:retrieve_review", args=[self.id])
class MovieTag(Tag):
movie = models.ForeignKey(Movie, on_delete=models.CASCADE, related_name='movie_tags', null=True)

View file

@ -10,8 +10,7 @@ from django.utils import timezone
from django.core.paginator import Paginator
from mastodon import mastodon_request_included
from mastodon.models import MastodonApplication
from mastodon.api import post_toot, TootVisibilityEnum
from mastodon.utils import rating_to_emoji
from mastodon.api import share_mark, share_review
from common.utils import PageLinksGenerator
from common.views import PAGE_LINK_NUMBER, jump_or_scrape
from common.models import SourceSiteEnum
@ -307,27 +306,7 @@ def create_update_mark(request):
return HttpResponseServerError("integrity error")
if form.cleaned_data['share_to_mastodon']:
if form.cleaned_data['visibility'] == 2:
visibility = TootVisibilityEnum.DIRECT
elif form.cleaned_data['visibility'] == 1:
visibility = TootVisibilityEnum.PRIVATE
else:
visibility = TootVisibilityEnum.PUBLIC if request.user.preference.mastodon_publish_public else TootVisibilityEnum.UNLISTED
url = "https://" + request.get_host() + reverse("movies:retrieve",
args=[movie.id])
words = MovieMarkStatusTranslator(form.cleaned_data['status']) +\
f"{movie.title}" + \
rating_to_emoji(form.cleaned_data['rating'], MastodonApplication.objects.get(domain_name=request.user.mastodon_site).star_mode)
# tags = settings.MASTODON_TAGS % {'category': '书', 'type': '标记'}
tags = ''
content = words + '\n' + url + '\n' + \
form.cleaned_data['text'] + '\n' + tags
response = post_toot(request.user.mastodon_site, content, visibility,
request.user.mastodon_token)
if response.status_code != 200:
mastodon_logger.error(
f"CODE:{response.status_code} {response.text}")
if not share_mark(form.instance):
return HttpResponseServerError("publishing mastodon status failed")
else:
return HttpResponseBadRequest(f"invalid form data {form.errors}")
@ -423,24 +402,7 @@ def create_review(request, movie_id):
form.instance.owner = request.user
form.save()
if form.cleaned_data['share_to_mastodon']:
if form.cleaned_data['visibility'] == 2:
visibility = TootVisibilityEnum.DIRECT
elif form.cleaned_data['visibility'] == 1:
visibility = TootVisibilityEnum.PRIVATE
else:
visibility = TootVisibilityEnum.PUBLIC if request.user.preference.mastodon_publish_public else TootVisibilityEnum.UNLISTED
url = "https://" + request.get_host() + reverse("movies:retrieve_review",
args=[form.instance.id])
words = "发布了关于" + f"{form.instance.movie.title}" + "的评论"
# tags = settings.MASTODON_TAGS % {'category': '书', 'type': '评论'}
tags = ''
content = words + '\n' + url + \
'\n' + form.cleaned_data['title'] + '\n' + tags
response = post_toot(request.user.mastodon_site, content, visibility,
request.user.mastodon_token)
if response.status_code != 200:
mastodon_logger.error(
f"CODE:{response.status_code} {response.text}")
if not share_review(form.instance):
return HttpResponseServerError("publishing mastodon status failed")
return redirect(reverse("movies:retrieve_review", args=[form.instance.id]))
else:
@ -477,24 +439,7 @@ def update_review(request, id):
form.instance.edited_time = timezone.now()
form.save()
if form.cleaned_data['share_to_mastodon']:
if form.cleaned_data['visibility'] == 2:
visibility = TootVisibilityEnum.DIRECT
elif form.cleaned_data['visibility'] == 1:
visibility = TootVisibilityEnum.PRIVATE
else:
visibility = TootVisibilityEnum.PUBLIC if request.user.preference.mastodon_publish_public else TootVisibilityEnum.UNLISTED
url = "https://" + request.get_host() + reverse("movies:retrieve_review",
args=[form.instance.id])
words = "发布了关于" + f"{form.instance.movie.title}" + "的评论"
# tags = settings.MASTODON_TAGS % {'category': '书', 'type': '评论'}
tags = ''
content = words + '\n' + url + \
'\n' + form.cleaned_data['title'] + '\n' + tags
response = post_toot(request.user.mastodon_site, content, visibility,
request.user.mastodon_token)
if response.status_code != 200:
mastodon_logger.error(
f"CODE:{response.status_code} {response.text}")
if not share_review(form.instance):
return HttpResponseServerError("publishing mastodon status failed")
return redirect(reverse("movies:retrieve_review", args=[form.instance.id]))
else:

View file

@ -7,12 +7,7 @@ from common.forms import *
def MusicMarkStatusTranslator(status):
trans_dict = {
MarkStatusEnum.DO.value: _("在听"),
MarkStatusEnum.WISH.value: _("想听"),
MarkStatusEnum.COLLECT.value: _("听过")
}
return trans_dict[status]
return MusicMarkStatusTranslation[status]
class SongForm(forms.ModelForm):

View file

@ -4,12 +4,19 @@ from django.utils.translation import gettext_lazy as _
from django.db import models
from django.core.serializers.json import DjangoJSONEncoder
from django.shortcuts import reverse
from common.models import Entity, Mark, Review, Tag, SourceSiteEnum
from common.models import Entity, Mark, Review, Tag, SourceSiteEnum, MarkStatusEnum
from common.utils import ChoicesDictGenerator, GenerateDateUUIDMediaFilePath
from django.utils import timezone
from django.conf import settings
MusicMarkStatusTranslation = {
MarkStatusEnum.DO.value: _("在听"),
MarkStatusEnum.WISH.value: _("想听"),
MarkStatusEnum.COLLECT.value: _("听过")
}
def song_cover_path(instance, filename):
return GenerateDateUUIDMediaFilePath(instance, filename, settings.SONG_MEDIA_PATH_ROOT)
@ -146,6 +153,10 @@ class SongMark(Mark):
fields=['owner', 'song'], name='unique_song_mark')
]
@property
def translated_status(self):
return MusicMarkStatusTranslation[self.status]
class SongReview(Review):
song = models.ForeignKey(
@ -157,6 +168,10 @@ class SongReview(Review):
fields=['owner', 'song'], name='unique_song_review')
]
@property
def url(self):
return settings.APP_WEBSITE + reverse("songs:retrieve_review", args=[self.id])
class SongTag(Tag):
song = models.ForeignKey(
@ -181,6 +196,10 @@ class AlbumMark(Mark):
fields=['owner', 'album'], name='unique_album_mark')
]
@property
def translated_status(self):
return MusicMarkStatusTranslation[self.status]
class AlbumReview(Review):
album = models.ForeignKey(
@ -192,6 +211,10 @@ class AlbumReview(Review):
fields=['owner', 'album'], name='unique_album_review')
]
@property
def url(self):
return settings.APP_WEBSITE + reverse("albums:retrieve_review", args=[self.id])
class AlbumTag(Tag):
album = models.ForeignKey(

View file

@ -4,8 +4,7 @@ from common.models import SourceSiteEnum
from common.views import PAGE_LINK_NUMBER, jump_or_scrape
from common.utils import PageLinksGenerator
from mastodon.models import MastodonApplication
from mastodon.utils import rating_to_emoji
from mastodon.api import post_toot, TootVisibilityEnum
from mastodon.api import share_mark, share_review
from mastodon import mastodon_request_included
from django.core.paginator import Paginator
from django.utils import timezone
@ -326,27 +325,7 @@ def create_update_song_mark(request):
return HttpResponseServerError("integrity error")
if form.cleaned_data['share_to_mastodon']:
if form.cleaned_data['visibility'] == 2:
visibility = TootVisibilityEnum.DIRECT
elif form.cleaned_data['visibility'] == 1:
visibility = TootVisibilityEnum.PRIVATE
else:
visibility = TootVisibilityEnum.PUBLIC if request.user.preference.mastodon_publish_public else TootVisibilityEnum.UNLISTED
url = "https://" + request.get_host() + reverse("music:retrieve_song",
args=[song.id])
words = MusicMarkStatusTranslator(form.cleaned_data['status']) +\
f"{song.title}" + \
rating_to_emoji(form.cleaned_data['rating'], MastodonApplication.objects.get(domain_name=request.user.mastodon_site).star_mode)
# tags = MASTODON_TAGS % {'category': '书', 'type': '标记'}
tags = ''
content = words + '\n' + url + '\n' + \
form.cleaned_data['text'] + '\n' + tags
response = post_toot(request.user.mastodon_site, content, visibility,
request.user.mastodon_token)
if response.status_code != 200:
mastodon_logger.error(
f"CODE:{response.status_code} {response.text}")
if not share_review(form.instance):
return HttpResponseServerError("publishing mastodon status failed")
else:
return HttpResponseBadRequest(f"invalid form data {form.errors}")
@ -442,24 +421,7 @@ def create_song_review(request, song_id):
form.instance.owner = request.user
form.save()
if form.cleaned_data['share_to_mastodon']:
if form.cleaned_data['visibility'] == 2:
visibility = TootVisibilityEnum.DIRECT
elif form.cleaned_data['visibility'] == 1:
visibility = TootVisibilityEnum.PRIVATE
else:
visibility = TootVisibilityEnum.PUBLIC if request.user.preference.mastodon_publish_public else TootVisibilityEnum.UNLISTED
url = "https://" + request.get_host() + reverse("music:retrieve_song_review",
args=[form.instance.id])
words = "发布了关于" + f"{form.instance.song.title}" + "的评论"
# tags = MASTODON_TAGS % {'category': '书', 'type': '评论'}
tags = ''
content = words + '\n' + url + \
'\n' + form.cleaned_data['title'] + '\n' + tags
response = post_toot(request.user.mastodon_site, content, visibility,
request.user.mastodon_token)
if response.status_code != 200:
mastodon_logger.error(
f"CODE:{response.status_code} {response.text}")
if not share_review(form.instance):
return HttpResponseServerError("publishing mastodon status failed")
return redirect(reverse("music:retrieve_song_review", args=[form.instance.id]))
else:
@ -496,24 +458,7 @@ def update_song_review(request, id):
form.instance.edited_time = timezone.now()
form.save()
if form.cleaned_data['share_to_mastodon']:
if form.cleaned_data['visibility'] == 2:
visibility = TootVisibilityEnum.DIRECT
elif form.cleaned_data['visibility'] == 1:
visibility = TootVisibilityEnum.PRIVATE
else:
visibility = TootVisibilityEnum.PUBLIC if request.user.preference.mastodon_publish_public else TootVisibilityEnum.UNLISTED
url = "https://" + request.get_host() + reverse("music:retrieve_song_review",
args=[form.instance.id])
words = "发布了关于" + f"{form.instance.song.title}" + "的评论"
# tags = MASTODON_TAGS % {'category': '书', 'type': '评论'}
tags = ''
content = words + '\n' + url + \
'\n' + form.cleaned_data['title'] + '\n' + tags
response = post_toot(request.user.mastodon_site, content, visibility,
request.user.mastodon_token)
if response.status_code != 200:
mastodon_logger.error(
f"CODE:{response.status_code} {response.text}")
if not share_review(form.instance):
return HttpResponseServerError("publishing mastodon status failed")
return redirect(reverse("music:retrieve_song_review", args=[form.instance.id]))
else:
@ -921,27 +866,7 @@ def create_update_album_mark(request):
return HttpResponseServerError("integrity error")
if form.cleaned_data['share_to_mastodon']:
if form.cleaned_data['visibility'] == 2:
visibility = TootVisibilityEnum.DIRECT
elif form.cleaned_data['visibility'] == 1:
visibility = TootVisibilityEnum.PRIVATE
else:
visibility = TootVisibilityEnum.PUBLIC if request.user.preference.mastodon_publish_public else TootVisibilityEnum.UNLISTED
url = "https://" + request.get_host() + reverse("music:retrieve_album",
args=[album.id])
words = MusicMarkStatusTranslator(form.cleaned_data['status']) +\
f"{album.title}" + \
rating_to_emoji(form.cleaned_data['rating'], MastodonApplication.objects.get(domain_name=request.user.mastodon_site).star_mode)
# tags = MASTODON_TAGS % {'category': '书', 'type': '标记'}
tags = ''
content = words + '\n' + url + '\n' + \
form.cleaned_data['text'] + '\n' + tags
response = post_toot(request.user.mastodon_site, content, visibility,
request.user.mastodon_token)
if response.status_code != 200:
mastodon_logger.error(
f"CODE:{response.status_code} {response.text}")
if not share_mark(form.instance):
return HttpResponseServerError("publishing mastodon status failed")
else:
return HttpResponseBadRequest(f"invalid form data {form.errors}")
@ -1037,24 +962,7 @@ def create_album_review(request, album_id):
form.instance.owner = request.user
form.save()
if form.cleaned_data['share_to_mastodon']:
if form.cleaned_data['visibility'] == 2:
visibility = TootVisibilityEnum.DIRECT
elif form.cleaned_data['visibility'] == 1:
visibility = TootVisibilityEnum.PRIVATE
else:
visibility = TootVisibilityEnum.PUBLIC if request.user.preference.mastodon_publish_public else TootVisibilityEnum.UNLISTED
url = "https://" + request.get_host() + reverse("music:retrieve_album_review",
args=[form.instance.id])
words = "发布了关于" + f"{form.instance.album.title}" + "的评论"
# tags = MASTODON_TAGS % {'category': '书', 'type': '评论'}
tags = ''
content = words + '\n' + url + \
'\n' + form.cleaned_data['title'] + '\n' + tags
response = post_toot(request.user.mastodon_site, content, visibility,
request.user.mastodon_token)
if response.status_code != 200:
mastodon_logger.error(
f"CODE:{response.status_code} {response.text}")
if not share_review(form.instance):
return HttpResponseServerError("publishing mastodon status failed")
return redirect(reverse("music:retrieve_album_review", args=[form.instance.id]))
else:
@ -1091,24 +999,7 @@ def update_album_review(request, id):
form.instance.edited_time = timezone.now()
form.save()
if form.cleaned_data['share_to_mastodon']:
if form.cleaned_data['visibility'] == 2:
visibility = TootVisibilityEnum.DIRECT
elif form.cleaned_data['visibility'] == 1:
visibility = TootVisibilityEnum.PRIVATE
else:
visibility = TootVisibilityEnum.PUBLIC if request.user.preference.mastodon_publish_public else TootVisibilityEnum.UNLISTED
url = "https://" + request.get_host() + reverse("music:retrieve_album_review",
args=[form.instance.id])
words = "发布了关于" + f"{form.instance.album.title}" + "的评论"
# tags = MASTODON_TAGS % {'category': '书', 'type': '评论'}
tags = ''
content = words + '\n' + url + \
'\n' + form.cleaned_data['title'] + '\n' + tags
response = post_toot(request.user.mastodon_site, content, visibility,
request.user.mastodon_token)
if response.status_code != 200:
mastodon_logger.error(
f"CODE:{response.status_code} {response.text}")
if not share_review(form.instance):
return HttpResponseServerError("publishing mastodon status failed")
return redirect(reverse("music:retrieve_album_review", args=[form.instance.id]))
else:

View file

@ -115,6 +115,7 @@ class Preference(models.Model):
)
export_status = models.JSONField(blank=True, null=True, encoder=DjangoJSONEncoder, default=dict)
mastodon_publish_public = models.BooleanField(null=False, default=False)
mastodon_append_tag = models.CharField(max_length=2048, default='')
def get_serialized_home_layout(self):
return str(self.home_layout).replace("\'", "\"")

View file

@ -29,21 +29,24 @@
<div class="main-section-wrapper">
<div class="tools-section-wrapper">
<div class="import-panel">
<h5 class="import-panel__label">{% trans '联邦网络Mastodon/Pleroma相关设置' %}</h5>
<h5 class="import-panel__label">{% trans '社交网络分享相关设置' %}</h5>
<div class="import-panel__body">
<form action="{% url 'users:preferences' %}" method="POST" enctype="multipart/form-data" >
<form action="{% url 'users:preferences' %}" method="POST">
{% csrf_token %}
<span>{% trans '以公开方式分享的帖文是否发布到公共时间轴上:' %}</span>
<span>{% trans '在联邦网络上以公开方式分享的帖文是否发布到公共时间轴上:' %}</span>
<div class="import-panel__checkbox import-panel__checkbox--last">
<input type="checkbox" name="mastodon_publish_public" id="visibility" {%if mastodon_publish_public%}checked{% endif %}>
<input type="checkbox" name="mastodon_publish_public" id="visibility" {%if request.user.preference.mastodon_publish_public%}checked{% endif %}>
<label for="visibility">{% trans '选中时为public未选中时为unlisted' %}</label>
</div>
<br><br>
<span>{% trans '分享贴文时附加标签:' %}</span>
<div class="import-panel__checkbox import-panel__checkbox--last">
<input name="mastodon_append_tag" id="tag" placeholder="#我的书影音" value="{{ request.user.preference.mastodon_append_tag }}" >
<label for="tag">{% trans '输入标签文字会被添加到贴文结尾' %}</label>
</div>
<div>
<input type="submit" class="import-panel__button" value="{% trans '保存' %}" id="uploadBtn"
{% if not latest_task is None and not latest_task.is_finished %}
disabled
{% endif %}
>
<input type="submit" class="import-panel__button" value="{% trans '保存' %}">
</div>
</form>
</div>

View file

@ -1048,8 +1048,9 @@ def auth_logout(request):
def preferences(request):
if request.method == 'POST':
request.user.preference.mastodon_publish_public = bool(request.POST.get('mastodon_publish_public'))
request.user.preference.mastodon_append_tag = request.POST.get('mastodon_append_tag', '').strip()
request.user.preference.save()
return render(request, 'users/preferences.html', {'mastodon_publish_public': request.user.preference.mastodon_publish_public})
return render(request, 'users/preferences.html')
@mastodon_request_included