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_PASSWORD=hotpocketm4st3r \
-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

View File

@ -1,6 +1,6 @@
services:
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:
HOTPOCKET_BACKEND_SECRET_KEY: "thisisntright"
HOTPOCKET_BACKEND_INITIAL_ACCOUNT_USERNAME: "hotpocket"

View File

@ -8,7 +8,7 @@ x-backend-environment: &x-backend-environment
services:
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:
<<: *x-backend-environment
HOTPOCKET_BACKEND_ALLOWED_HOSTS: "app.staging.hotpocket.bthlab.bthlabs.net"
@ -21,7 +21,7 @@ services:
restart: "unless-stopped"
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:
<<: *x-backend-environment
HOTPOCKET_BACKEND_APP: "admin"
@ -35,7 +35,7 @@ services:
restart: "unless-stopped"
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:
- "/srv/venv/bin/celery"
- "-A"
@ -57,7 +57,7 @@ services:
restart: "unless-stopped"
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:
- "/srv/venv/bin/celery"
- "-A"

View File

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

View File

@ -2,7 +2,6 @@
from __future__ import annotations
from django.contrib import messages
import django.db
from django.http import HttpRequest, HttpResponse
from django.shortcuts import redirect
from django.urls import reverse
@ -22,13 +21,15 @@ class CreateSaveWorkflow(SaveWorkflow):
url: str,
force_post_save: bool = False,
) -> HttpResponse:
with django.db.transaction.atomic():
save = self.create(
account.pk,
SaveIn(url=url),
)
save = self.create(
account.pk,
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'))
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-Association-PK'] = association.pk
if save.last_processed_at is None:
processing_result = self.schedule_processing(save) # noqa: F841
return response

View File

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

View File

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

View File

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

View File

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

View File

@ -13,7 +13,7 @@ cat <<EOF
|_|
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/)
Licensed under Apache-2.0
EOF

View File

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

View File

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

View File

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