Compare commits

..

No commits in common. "public" and "v1.0.1" have entirely different histories.

13 changed files with 52 additions and 49 deletions

View File

@ -66,7 +66,7 @@ $ docker run --rm -it \
-e HOTPOCKET_BACKEND_INITIAL_ACCOUNT_USERNAME=hotpocket \ -e HOTPOCKET_BACKEND_INITIAL_ACCOUNT_USERNAME=hotpocket \
-e HOTPOCKET_BACKEND_INITIAL_ACCOUNT_PASSWORD=hotpocketm4st3r \ -e HOTPOCKET_BACKEND_INITIAL_ACCOUNT_PASSWORD=hotpocketm4st3r \
-p 8000:8000 \ -p 8000:8000 \
docker-hosted.nexus.bthlabs.pl/hotpocket/backend:aio-v1.0.2-01 docker-hosted.nexus.bthlabs.pl/hotpocket/backend:aio-v1.0.1-01
``` ```
The command above will set up and start the application. The SQLite file will The command above will set up and start the application. The SQLite file will

View File

@ -1,6 +1,6 @@
services: services:
backend: backend:
image: "docker-hosted.nexus.bthlabs.pl/hotpocket/backend:aio-v1.0.2-01" image: "docker-hosted.nexus.bthlabs.pl/hotpocket/backend:aio-v1.0.1-01"
environment: environment:
HOTPOCKET_BACKEND_SECRET_KEY: "thisisntright" HOTPOCKET_BACKEND_SECRET_KEY: "thisisntright"
HOTPOCKET_BACKEND_INITIAL_ACCOUNT_USERNAME: "hotpocket" HOTPOCKET_BACKEND_INITIAL_ACCOUNT_USERNAME: "hotpocket"

View File

@ -8,7 +8,7 @@ x-backend-environment: &x-backend-environment
services: services:
webapp: webapp:
image: "docker-hosted.nexus.bthlabs.pl/hotpocket/backend:deployment-v1.0.2-01" image: "docker-hosted.nexus.bthlabs.pl/hotpocket/backend:deployment-v1.0.1-01"
environment: environment:
<<: *x-backend-environment <<: *x-backend-environment
HOTPOCKET_BACKEND_ALLOWED_HOSTS: "app.staging.hotpocket.bthlab.bthlabs.net" HOTPOCKET_BACKEND_ALLOWED_HOSTS: "app.staging.hotpocket.bthlab.bthlabs.net"
@ -21,7 +21,7 @@ services:
restart: "unless-stopped" restart: "unless-stopped"
admin: admin:
image: "docker-hosted.nexus.bthlabs.pl/hotpocket/backend:deployment-v1.0.2-01" image: "docker-hosted.nexus.bthlabs.pl/hotpocket/backend:deployment-v1.0.1-01"
environment: environment:
<<: *x-backend-environment <<: *x-backend-environment
HOTPOCKET_BACKEND_APP: "admin" HOTPOCKET_BACKEND_APP: "admin"
@ -35,7 +35,7 @@ services:
restart: "unless-stopped" restart: "unless-stopped"
celery-worker: celery-worker:
image: "docker-hosted.nexus.bthlabs.pl/hotpocket/backend:deployment-v1.0.2-01" image: "docker-hosted.nexus.bthlabs.pl/hotpocket/backend:deployment-v1.0.1-01"
command: command:
- "/srv/venv/bin/celery" - "/srv/venv/bin/celery"
- "-A" - "-A"
@ -57,7 +57,7 @@ services:
restart: "unless-stopped" restart: "unless-stopped"
celery-beat: celery-beat:
image: "docker-hosted.nexus.bthlabs.pl/hotpocket/backend:deployment-v1.0.2-01" image: "docker-hosted.nexus.bthlabs.pl/hotpocket/backend:deployment-v1.0.1-01"
command: command:
- "/srv/venv/bin/celery" - "/srv/venv/bin/celery"
- "-A" - "-A"

View File

@ -1,4 +1,4 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import annotations from __future__ import annotations
version = '1.0.2' version = '1.0.1'

View File

@ -2,7 +2,6 @@
from __future__ import annotations from __future__ import annotations
from django.contrib import messages from django.contrib import messages
import django.db
from django.http import HttpRequest, HttpResponse from django.http import HttpRequest, HttpResponse
from django.shortcuts import redirect from django.shortcuts import redirect
from django.urls import reverse from django.urls import reverse
@ -22,13 +21,15 @@ class CreateSaveWorkflow(SaveWorkflow):
url: str, url: str,
force_post_save: bool = False, force_post_save: bool = False,
) -> HttpResponse: ) -> HttpResponse:
with django.db.transaction.atomic(): save = self.create(
save = self.create( account.pk,
account.pk, SaveIn(url=url),
SaveIn(url=url), )
)
association = self.associate(account.pk, save) association = self.associate(account.pk, save)
if save.last_processed_at is None:
processing_result = self.schedule_processing(save) # noqa: F841
response = redirect(reverse('ui.associations.browse')) response = redirect(reverse('ui.associations.browse'))
if force_post_save is True or save.is_netloc_banned is True: if force_post_save is True or save.is_netloc_banned is True:
@ -46,7 +47,4 @@ class CreateSaveWorkflow(SaveWorkflow):
response.headers['X-HotPocket-Testing-Save-PK'] = save.pk response.headers['X-HotPocket-Testing-Save-PK'] = save.pk
response.headers['X-HotPocket-Testing-Association-PK'] = association.pk response.headers['X-HotPocket-Testing-Association-PK'] = association.pk
if save.last_processed_at is None:
processing_result = self.schedule_processing(save) # noqa: F841
return response return response

View File

@ -7,7 +7,7 @@
{% if association.title %} {% if association.title %}
{{ association.title }} {{ association.title }}
{% else %} {% else %}
{{ association.target.url }} {% translate 'Untitled' %}
{% endif %} {% endif %}
</a> </a>
</h5> </h5>

View File

@ -4,6 +4,7 @@ from __future__ import annotations
import http import http
import logging import logging
import django.db
from django.http import HttpRequest, HttpResponse from django.http import HttpRequest, HttpResponse
from django.shortcuts import render from django.shortcuts import render
from django.views.decorators.csrf import csrf_exempt from django.views.decorators.csrf import csrf_exempt
@ -20,18 +21,19 @@ def share_sheet(request: HttpRequest) -> HttpResponse:
LOGGER.debug('POST=`%s`', request.POST) LOGGER.debug('POST=`%s`', request.POST)
try: try:
assert request.user.is_anonymous is False, 'Login required' with django.db.transaction.atomic():
assert 'text' in request.POST, 'Bad request: Missing `text`' assert request.user.is_anonymous is False, 'Login required'
assert 'text' in request.POST, 'Bad request: Missing `text`'
url = request.POST['text'].split('\n')[0].strip() url = request.POST['text'].split('\n')[0].strip()
assert url != '', 'Bad request: Empty `text`' assert url != '', 'Bad request: Empty `text`'
return CreateSaveWorkflow().run( return CreateSaveWorkflow().run(
request=request, request=request,
account=request.user, account=request.user,
url=url, url=url,
force_post_save=True, force_post_save=True,
) )
except Exception as exception: except Exception as exception:
LOGGER.error( LOGGER.error(
'Unhandled exception: %s', 'Unhandled exception: %s',

View File

@ -4,6 +4,7 @@ from __future__ import annotations
import http import http
import logging import logging
import django.db
from django.http import HttpRequest, HttpResponse from django.http import HttpRequest, HttpResponse
from django.shortcuts import render from django.shortcuts import render
@ -18,18 +19,19 @@ def shortcut(request: HttpRequest) -> HttpResponse:
LOGGER.debug('GET=`%s`', request.GET) LOGGER.debug('GET=`%s`', request.GET)
try: try:
assert request.user.is_anonymous is False, 'Login required' with django.db.transaction.atomic():
assert 'url' in request.GET, 'Bad request: Missing `url`' assert request.user.is_anonymous is False, 'Login required'
assert 'url' in request.GET, 'Bad request: Missing `url`'
url = request.GET['url'].split('\n')[0].strip() url = request.GET['url'].split('\n')[0].strip()
assert url != '', 'Bad request: Empty `url`' assert url != '', 'Bad request: Empty `url`'
return CreateSaveWorkflow().run( return CreateSaveWorkflow().run(
request=request, request=request,
account=request.user, account=request.user,
url=url, url=url,
force_post_save=True, force_post_save=True,
) )
except Exception as exception: except Exception as exception:
LOGGER.error( LOGGER.error(
'Unhandled exception: %s', 'Unhandled exception: %s',

View File

@ -4,6 +4,7 @@ from __future__ import annotations
import http import http
import logging import logging
import django.db
from django.http import HttpRequest, HttpResponse from django.http import HttpRequest, HttpResponse
from django.shortcuts import render from django.shortcuts import render
from django.urls import reverse from django.urls import reverse
@ -23,11 +24,12 @@ class CreateView(AccountRequiredMixin, FormView):
form_class = CreateForm form_class = CreateForm
def form_valid(self, form: CreateForm) -> HttpResponse: def form_valid(self, form: CreateForm) -> HttpResponse:
return CreateSaveWorkflow().run( with django.db.transaction.atomic():
request=self.request, return CreateSaveWorkflow().run(
account=self.request.user, request=self.request,
url=form.cleaned_data['url'], account=self.request.user,
) url=form.cleaned_data['url'],
)
def get_success_url(self) -> str: def get_success_url(self) -> str:
return reverse('ui.associations.browse') return reverse('ui.associations.browse')

View File

@ -13,7 +13,7 @@ cat <<EOF
|_| |_|
production production
HotPocket v1.0.2 [${HOTPOCKET_BACKEND_IMAGE_ID}] (https://hotpocket.app/) HotPocket v1.0.1 [${HOTPOCKET_BACKEND_IMAGE_ID}] (https://hotpocket.app/)
Copyright 2025-present by BTHLabs. All rights reserved. (https://bthlabs.pl/) Copyright 2025-present by BTHLabs. All rights reserved. (https://bthlabs.pl/)
Licensed under Apache-2.0 Licensed under Apache-2.0
EOF EOF

View File

@ -1,6 +1,6 @@
{ {
"name": "hotpocket-backend", "name": "hotpocket-backend",
"version": "1.0.2", "version": "1.0.1",
"description": "HotPocket Backend", "description": "HotPocket Backend",
"main": "hotpocket_backend/apps/frontend/src/index.js", "main": "hotpocket_backend/apps/frontend/src/index.js",
"repository": "https://git.bthlabs.pl/tomekwojcik/hotpocket", "repository": "https://git.bthlabs.pl/tomekwojcik/hotpocket",

View File

@ -1,6 +1,6 @@
[tool.poetry] [tool.poetry]
name = "hotpocket-backend" name = "hotpocket-backend"
version = "1.0.2" version = "1.0.1"
description = "HotPocket Backend" description = "HotPocket Backend"
authors = ["Tomek Wójcik <contact@bthlabs.pl>"] authors = ["Tomek Wójcik <contact@bthlabs.pl>"]
license = "Apache-2.0" license = "Apache-2.0"

View File

@ -2,9 +2,8 @@
extend-exclude = extend-exclude =
hotpocket_backend/apps/*/migrations/*.py, hotpocket_backend/apps/*/migrations/*.py,
node_modules/**/*.py, node_modules/**/*.py,
skel/*.py, skel/*.py
skel/*/*.py, skel/*/*.py
playground.py
ignore = E131,W503,W504 ignore = E131,W503,W504
max-line-length = 119 max-line-length = 119
hang-closing = False hang-closing = False