diff --git a/books/forms.py b/books/forms.py index 93e61c48..5ff9cc5c 100644 --- a/books/forms.py +++ b/books/forms.py @@ -1,10 +1,10 @@ from django import forms -from common.forms import KeyValueInput from django.contrib.postgres.forms import SimpleArrayField from django.utils.translation import gettext_lazy as _ from .models import Book, BookMark, BookReview from common.models import MarkStatusEnum from common.forms import RadioBooleanField, RatingValidator, TagField, TagInput +from common.forms import KeyValueInput from common.forms import PreviewImageInput @@ -84,6 +84,7 @@ class BookMarkForm(forms.ModelForm): (False, _("公开")), ] STATUS_CHOICES = [(v, BookMarkStatusTranslator(v)) for v in MarkStatusEnum.values] + id = forms.IntegerField(required=False, widget=forms.HiddenInput()) share_to_mastodon = forms.BooleanField(label=_("分享到长毛象"), initial=True, required=False) rating = forms.IntegerField(validators=[RatingValidator()], widget=forms.HiddenInput(), required=False) @@ -102,6 +103,18 @@ class BookMarkForm(forms.ModelForm): widget=TagInput(attrs={'placeholder': _("回车增加标签")}), label = _("标签") ) + text = forms.CharField( + required=False, + widget=forms.Textarea( + attrs={ + "placeholder": _("最多只能写360字哦~"), + "maxlength": 360 + } + ), + + label = _("短评"), + ) + class Meta: model = BookMark fields = [ @@ -114,11 +127,9 @@ class BookMarkForm(forms.ModelForm): ] labels = { 'rating': _("评分"), - 'text': _("短评"), } widgets = { 'book': forms.TextInput(attrs={"hidden": ""}), - 'text': forms.Textarea(attrs={"placeholder": _("最多只能写500字哦~")}), } diff --git a/books/views.py b/books/views.py index 896e5ca2..af69aa95 100644 --- a/books/views.py +++ b/books/views.py @@ -20,7 +20,7 @@ from .forms import BookMarkStatusTranslator from boofilsic.settings import MASTODON_TAGS - +logger = logging.getLogger(__name__) mastodon_logger = logging.getLogger("django.mastodon") @@ -197,6 +197,7 @@ def retrieve(request, id): ) else: return HttpResponseBadRequest() + logger.warning('non-GET method at /book/') @login_required @@ -270,7 +271,8 @@ def create_update_mark(request): mark=form.instance ) except IntegrityError as e: - return HttpResponseServerError() + return HttpResponseServerError("integrity error") + logger.error(e.__str__()) if form.cleaned_data['share_to_mastodon']: if form.cleaned_data['is_private']: @@ -283,13 +285,14 @@ def create_update_mark(request): f"《{book.title}》" + \ rating_to_emoji(form.cleaned_data['rating']) - tags = MASTODON_TAGS % {'category': '书', 'type': '标记'} + # tags = MASTODON_TAGS % {'category': '书', 'type': '标记'} + tags = '' content = words + '\n' + url + '\n' + \ form.cleaned_data['text'] + '\n' + tags response = post_toot(content, visibility, request.session['oauth_token']) if response.status_code != 200: + mastodon_logger.error(f"CODE:{response.status_code} {response.text}") return HttpResponseServerError("publishing mastodon status failed") - mastodon_logger.error(response.text) else: return HttpResponseBadRequest("invalid form data") @@ -370,13 +373,15 @@ def create_review(request, book_id): url = "https://" + request.get_host() + reverse("books:retrieve_review", args=[form.instance.id]) words = "发布了关于" + f"《{form.instance.book.title}》" + "的评论" - tags = MASTODON_TAGS % {'category': '书', 'type': '评论'} + # tags = MASTODON_TAGS % {'category': '书', 'type': '评论'} + tags = '' content = words + '\n' + url + \ '\n' + form.cleaned_data['title'] + '\n' + tags response = post_toot(content, visibility, request.session['oauth_token']) if response.status_code != 200: + mastodon_logger.error( + f"CODE:{response.status_code} {response.text}") return HttpResponseServerError("publishing mastodon status failed") - mastodon_logger.error(response.text) return redirect(reverse("books:retrieve_review", args=[form.instance.id])) else: return HttpResponseBadRequest() @@ -421,13 +426,14 @@ def update_review(request, id): url = "https://" + request.get_host() + reverse("books:retrieve_review", args=[form.instance.id]) words = "发布了关于" + f"《{form.instance.book.title}》" + "的评论" - tags = MASTODON_TAGS % {'category': '书', 'type': '评论'} + # tags = MASTODON_TAGS % {'category': '书', 'type': '评论'} + tags = '' content = words + '\n' + url + \ '\n' + form.cleaned_data['title'] + '\n' + tags response = post_toot(content, visibility, request.session['oauth_token']) if response.status_code != 200: + mastodon_logger.error(f"CODE:{response.status_code} {response.text}") return HttpResponseServerError("publishing mastodon status failed") - mastodon_logger.error(response.text) return redirect(reverse("books:retrieve_review", args=[form.instance.id])) else: return HttpResponseBadRequest() diff --git a/log b/log index e69de29b..e63f9291 100644 --- a/log +++ b/log @@ -0,0 +1,127 @@ +[ERROR] 2020-08-28 21:50:15,820 django.request log Internal Server Error: /books/mark/ +[ERROR] 2020-08-28 21:50:15,822 django.server basehttp "POST /books/mark/ HTTP/1.1" 500 33 +[INFO] 2020-08-28 21:52:27,064 django.server basehttp "GET /books/48/ HTTP/1.1" 200 23125 +[INFO] 2020-08-28 21:52:27,157 django.server basehttp "GET /static/lib/css/rating-star.css HTTP/1.1" 200 591 +[INFO] 2020-08-28 21:52:27,159 django.server basehttp "GET /static/css/boofilsic.css HTTP/1.1" 200 40956 +[INFO] 2020-08-28 21:52:27,187 django.server basehttp "GET /static/js/detail.js HTTP/1.1" 200 4350 +[INFO] 2020-08-28 21:52:27,188 django.server basehttp "GET /static/lib/js/rating-star.js HTTP/1.1" 200 11577 +[INFO] 2020-08-28 21:52:27,208 django.server basehttp "GET /static/lib/css/tag-input.css HTTP/1.1" 200 1198 +[INFO] 2020-08-28 21:52:27,223 django.server basehttp "GET /static/lib/js/tag-input.js HTTP/1.1" 200 5193 +[INFO] 2020-08-28 21:52:27,236 django.server basehttp "GET /static/img/logo.svg HTTP/1.1" 200 3051 +[WARNING] 2020-08-28 21:52:27,260 django.request log Not Found: /media/book/default.svg +[WARNING] 2020-08-28 21:52:27,261 django.server basehttp "GET /media/book/default.svg HTTP/1.1" 404 2967 +[INFO] 2020-08-28 21:52:27,456 django.server basehttp "GET /search/?page=2&q= HTTP/1.1" 200 19741 +[INFO] 2020-08-28 21:52:27,527 django.server basehttp "GET /static/lib/css/rating-star.css HTTP/1.1" 200 591 +[INFO] 2020-08-28 21:52:27,529 django.server basehttp "GET /static/css/boofilsic.css HTTP/1.1" 200 40956 +[INFO] 2020-08-28 21:52:27,556 django.server basehttp "GET /static/js/rating-star-readonly.js HTTP/1.1" 200 325 +[INFO] 2020-08-28 21:52:27,558 django.server basehttp "GET /static/lib/js/rating-star.js HTTP/1.1" 200 11577 +[INFO] 2020-08-28 21:52:27,576 django.server basehttp "GET /static/img/logo.svg HTTP/1.1" 200 3051 +[WARNING] 2020-08-28 21:52:27,597 django.request log Not Found: /media/book/default.svg +[WARNING] 2020-08-28 21:52:27,598 django.server basehttp "GET /media/book/default.svg HTTP/1.1" 404 2967 +[WARNING] 2020-08-28 21:52:27,622 django.request log Not Found: /media/book/2020/05/154fedf015-edc3-4079-8552-43775f276470.jpg +[WARNING] 2020-08-28 21:52:27,631 django.server basehttp "GET /media/book/2020/05/154fedf015-edc3-4079-8552-43775f276470.jpg HTTP/1.1" 404 3084 +[WARNING] 2020-08-28 21:52:27,643 django.request log Not Found: /media/book/default.svg +[WARNING] 2020-08-28 21:52:27,649 django.server basehttp "GET /media/book/default.svg HTTP/1.1" 404 2967 +[WARNING] 2020-08-28 21:52:27,659 django.request log Not Found: /media/book/2020/05/15a543b2c6-3a8f-4248-bdf8-f673b771a3f4.jpg +[WARNING] 2020-08-28 21:52:27,660 django.server basehttp "GET /media/book/2020/05/15a543b2c6-3a8f-4248-bdf8-f673b771a3f4.jpg HTTP/1.1" 404 3084 +[INFO] 2020-08-28 21:52:31,695 django.server basehttp "GET /books/48/ HTTP/1.1" 200 23125 +[INFO] 2020-08-28 21:52:31,767 django.server basehttp "GET /static/lib/js/rating-star.js HTTP/1.1" 200 11577 +[INFO] 2020-08-28 21:52:31,769 django.server basehttp "GET /static/css/boofilsic.css HTTP/1.1" 200 40956 +[INFO] 2020-08-28 21:52:31,784 django.server basehttp "GET /static/lib/css/rating-star.css HTTP/1.1" 200 591 +[WARNING] 2020-08-28 21:52:31,850 django.request log Not Found: /media/book/default.svg +[INFO] 2020-08-28 21:52:31,852 django.server basehttp "GET /static/js/detail.js HTTP/1.1" 200 4350 +[WARNING] 2020-08-28 21:52:31,854 django.server basehttp "GET /media/book/default.svg HTTP/1.1" 404 2967 +[INFO] 2020-08-28 21:52:31,867 django.server basehttp "GET /static/lib/css/tag-input.css HTTP/1.1" 200 1198 +[INFO] 2020-08-28 21:52:31,878 django.server basehttp "GET /static/lib/js/tag-input.js HTTP/1.1" 200 5193 +[INFO] 2020-08-28 21:52:31,890 django.server basehttp "GET /static/img/logo.svg HTTP/1.1" 200 3051 +[WARNING] 2020-08-28 21:52:31,912 django.request log Not Found: /media/book/default.svg +[WARNING] 2020-08-28 21:52:31,913 django.server basehttp "GET /media/book/default.svg HTTP/1.1" 404 2967 +[ERROR] 2020-08-28 21:52:36,532 django.request log Internal Server Error: /books/mark/ +Traceback (most recent call last): + File "E:\venvs\boofilsic\lib\site-packages\django\core\handlers\exception.py", line 34, in inner + response = get_response(request) + File "E:\venvs\boofilsic\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response + response = self.process_exception_by_middleware(e, request) + File "E:\venvs\boofilsic\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + File "E:\Workspace\boofilsic\common\mastodon\decorators.py", line 13, in wrapper + return func(*args, **kwargs) + File "E:\venvs\boofilsic\lib\site-packages\django\contrib\auth\decorators.py", line 21, in _wrapped_view + return view_func(request, *args, **kwargs) + File "E:\Workspace\boofilsic\books\views.py", line 293, in create_update_mark + mastodon_logger.error(response.status_code + '|' + response.text) +TypeError: unsupported operand type(s) for +: 'int' and 'str' +[ERROR] 2020-08-28 21:52:36,536 django.server basehttp "POST /books/mark/ HTTP/1.1" 500 89092 +[WARNING] 2020-08-28 21:52:36,672 django.request log Not Found: /media/book/default.svg +[WARNING] 2020-08-28 21:52:36,674 django.server basehttp "GET /media/book/default.svg HTTP/1.1" 404 2967 +[ERROR] 2020-08-28 21:53:04,573 django.mastodon views 422|{"error":"֤ʧ: Text 500 ֵ"} +[ERROR] 2020-08-28 21:53:04,576 django.request log Internal Server Error: /books/mark/ +[ERROR] 2020-08-28 21:53:04,579 django.server basehttp "POST /books/mark/ HTTP/1.1" 500 33 +[WARNING] 2020-08-28 21:53:04,716 django.request log Not Found: /media/book/default.svg +[WARNING] 2020-08-28 21:53:04,717 django.server basehttp "GET /media/book/default.svg HTTP/1.1" 404 2967 +[INFO] 2020-08-28 21:54:50,966 django.server basehttp "GET /books/48/ HTTP/1.1" 200 23125 +[INFO] 2020-08-28 21:54:51,049 django.server basehttp "GET /static/css/boofilsic.css HTTP/1.1" 200 40956 +[INFO] 2020-08-28 21:54:51,058 django.server basehttp "GET /static/lib/css/rating-star.css HTTP/1.1" 200 591 +[INFO] 2020-08-28 21:54:51,074 django.server basehttp "GET /static/lib/js/rating-star.js HTTP/1.1" 200 11577 +[INFO] 2020-08-28 21:54:51,083 django.server basehttp "GET /static/js/detail.js HTTP/1.1" 200 4350 +[INFO] 2020-08-28 21:54:51,097 django.server basehttp "GET /static/lib/css/tag-input.css HTTP/1.1" 200 1198 +[WARNING] 2020-08-28 21:54:51,118 django.request log Not Found: /media/book/default.svg +[WARNING] 2020-08-28 21:54:51,119 django.server basehttp "GET /media/book/default.svg HTTP/1.1" 404 2967 +[INFO] 2020-08-28 21:54:51,127 django.server basehttp "GET /static/lib/js/tag-input.js HTTP/1.1" 200 5193 +[INFO] 2020-08-28 21:54:51,138 django.server basehttp "GET /static/img/logo.svg HTTP/1.1" 200 3051 +[WARNING] 2020-08-28 21:54:51,162 django.request log Not Found: /media/book/default.svg +[WARNING] 2020-08-28 21:54:51,163 django.server basehttp "GET /media/book/default.svg HTTP/1.1" 404 2967 +[ERROR] 2020-08-28 21:54:59,328 django.mastodon views 422|{"error":"֤ʧ: Text 500 ֵ"} +[ERROR] 2020-08-28 21:54:59,328 django.request log Internal Server Error: /books/mark/ +[ERROR] 2020-08-28 21:54:59,329 django.server basehttp "POST /books/mark/ HTTP/1.1" 500 33 +[INFO] 2020-08-28 21:55:04,092 django.server basehttp "GET /books/48/ HTTP/1.1" 200 23116 +[INFO] 2020-08-28 21:55:04,167 django.server basehttp "GET /static/lib/js/rating-star.js HTTP/1.1" 200 11577 +[INFO] 2020-08-28 21:55:04,177 django.server basehttp "GET /static/css/boofilsic.css HTTP/1.1" 200 40956 +[INFO] 2020-08-28 21:55:04,187 django.server basehttp "GET /static/lib/css/rating-star.css HTTP/1.1" 200 591 +[INFO] 2020-08-28 21:55:04,197 django.server basehttp "GET /static/js/detail.js HTTP/1.1" 200 4350 +[INFO] 2020-08-28 21:55:04,211 django.server basehttp "GET /static/lib/css/tag-input.css HTTP/1.1" 200 1198 +[INFO] 2020-08-28 21:55:04,224 django.server basehttp "GET /static/lib/js/tag-input.js HTTP/1.1" 200 5193 +[INFO] 2020-08-28 21:55:04,239 django.server basehttp "GET /static/img/logo.svg HTTP/1.1" 200 3051 +[WARNING] 2020-08-28 21:55:04,265 django.request log Not Found: /media/book/default.svg +[WARNING] 2020-08-28 21:55:04,266 django.server basehttp "GET /media/book/default.svg HTTP/1.1" 404 2967 +[INFO] 2020-08-28 22:09:13,443 django.server basehttp "GET /books/48/ HTTP/1.1" 200 23116 +[INFO] 2020-08-28 22:09:13,574 django.server basehttp "GET /static/lib/css/rating-star.css HTTP/1.1" 200 591 +[INFO] 2020-08-28 22:09:13,575 django.server basehttp "GET /static/css/boofilsic.css HTTP/1.1" 200 40956 +[INFO] 2020-08-28 22:09:13,588 django.server basehttp "GET /static/js/detail.js HTTP/1.1" 200 4350 +[INFO] 2020-08-28 22:09:13,589 django.server basehttp "GET /static/lib/js/rating-star.js HTTP/1.1" 200 11577 +[INFO] 2020-08-28 22:09:13,602 django.server basehttp "GET /static/lib/css/tag-input.css HTTP/1.1" 200 1198 +[INFO] 2020-08-28 22:09:13,620 django.server basehttp "GET /static/lib/js/tag-input.js HTTP/1.1" 200 5193 +[INFO] 2020-08-28 22:09:13,623 django.server basehttp "GET /static/img/logo.svg HTTP/1.1" 200 3051 +[WARNING] 2020-08-28 22:09:13,658 django.request log Not Found: /media/book/default.svg +[WARNING] 2020-08-28 22:09:13,660 django.server basehttp "GET /media/book/default.svg HTTP/1.1" 404 2967 +[INFO] 2020-08-28 22:09:45,386 django.server basehttp "GET /books/48/ HTTP/1.1" 200 23116 +[INFO] 2020-08-28 22:09:45,456 django.server basehttp "GET /static/lib/css/rating-star.css HTTP/1.1" 200 591 +[INFO] 2020-08-28 22:09:45,458 django.server basehttp "GET /static/css/boofilsic.css HTTP/1.1" 200 40956 +[INFO] 2020-08-28 22:09:45,476 django.server basehttp "GET /static/lib/js/rating-star.js HTTP/1.1" 200 11577 +[INFO] 2020-08-28 22:09:45,477 django.server basehttp "GET /static/js/detail.js HTTP/1.1" 200 4350 +[INFO] 2020-08-28 22:09:45,507 django.server basehttp "GET /static/lib/css/tag-input.css HTTP/1.1" 200 1198 +[INFO] 2020-08-28 22:09:45,524 django.server basehttp "GET /static/lib/js/tag-input.js HTTP/1.1" 200 5193 +[INFO] 2020-08-28 22:09:45,540 django.server basehttp "GET /static/img/logo.svg HTTP/1.1" 200 3051 +[WARNING] 2020-08-28 22:09:45,562 django.request log Not Found: /media/book/default.svg +[WARNING] 2020-08-28 22:09:45,563 django.server basehttp "GET /media/book/default.svg HTTP/1.1" 404 2967 +[INFO] 2020-08-28 22:09:59,284 django.server basehttp "POST /books/mark/ HTTP/1.1" 302 0 +[INFO] 2020-08-28 22:10:03,692 django.server basehttp "GET /books/48/ HTTP/1.1" 200 20641 +[INFO] 2020-08-28 22:10:03,760 django.server basehttp "GET /static/lib/js/rating-star.js HTTP/1.1" 200 11577 +[INFO] 2020-08-28 22:10:03,760 django.server basehttp "GET /static/js/detail.js HTTP/1.1" 200 4350 +[INFO] 2020-08-28 22:10:03,776 django.server basehttp "GET /static/lib/css/rating-star.css HTTP/1.1" 200 591 +[INFO] 2020-08-28 22:10:03,778 django.server basehttp "GET /static/css/boofilsic.css HTTP/1.1" 200 40956 +[INFO] 2020-08-28 22:10:03,807 django.server basehttp "GET /static/lib/css/tag-input.css HTTP/1.1" 200 1198 +[INFO] 2020-08-28 22:10:03,865 django.server basehttp "GET /static/lib/js/tag-input.js HTTP/1.1" 200 5193 +[INFO] 2020-08-28 22:10:03,879 django.server basehttp "GET /static/img/logo.svg HTTP/1.1" 200 3051 +[WARNING] 2020-08-28 22:10:03,898 django.request log Not Found: /media/book/default.svg +[WARNING] 2020-08-28 22:10:03,899 django.server basehttp "GET /media/book/default.svg HTTP/1.1" 404 2967 +[INFO] 2020-08-28 22:20:39,951 django.server basehttp "GET /books/48/ HTTP/1.1" 200 20641 +[INFO] 2020-08-28 22:20:40,022 django.server basehttp "GET /static/lib/css/rating-star.css HTTP/1.1" 200 591 +[INFO] 2020-08-28 22:20:40,024 django.server basehttp "GET /static/css/boofilsic.css HTTP/1.1" 200 40956 +[INFO] 2020-08-28 22:20:40,039 django.server basehttp "GET /static/lib/js/rating-star.js HTTP/1.1" 200 11577 +[INFO] 2020-08-28 22:20:40,040 django.server basehttp "GET /static/js/detail.js HTTP/1.1" 200 4350 +[INFO] 2020-08-28 22:20:40,085 django.server basehttp "GET /static/lib/css/tag-input.css HTTP/1.1" 200 1198 +[INFO] 2020-08-28 22:20:40,100 django.server basehttp "GET /static/lib/js/tag-input.js HTTP/1.1" 200 5193 +[INFO] 2020-08-28 22:20:40,112 django.server basehttp "GET /static/img/logo.svg HTTP/1.1" 200 3051 +[WARNING] 2020-08-28 22:20:40,132 django.request log Not Found: /media/book/default.svg +[WARNING] 2020-08-28 22:20:40,132 django.server basehttp "GET /media/book/default.svg HTTP/1.1" 404 2967