7 Commits

Author SHA1 Message Date
1b775a130b Release 26.1.14.post0
All checks were successful
Production deployment / Build (release) Successful in 1m58s
Staging deployment / Build (release) Successful in 2m0s
CI / Checks (push) Successful in 4m43s
Staging deployment / Deploy (release) Successful in 1m56s
Production deployment / Deploy (release) Successful in 2m25s
2026-01-14 21:24:09 +01:00
bcef0d2d09 BTHLABS-0000: Fixed DB host resolution post VPN migration 2026-01-14 21:23:15 +01:00
9f121a0ceb Release v26.1.14
Some checks failed
CI / Checks (push) Successful in 1m50s
Production deployment / Build (release) Successful in 58s
Staging deployment / Build (release) Successful in 59s
Staging deployment / Deploy (release) Successful in 1m45s
Production deployment / Deploy (release) Failing after 4m29s
2026-01-14 20:59:08 +01:00
d16f0cd957 BTHLABS-81: OG Properties on Share Association page
Co-authored-by: Tomek Wójcik <labs@tomekwojcik.pl>
Co-committed-by: Tomek Wójcik <labs@tomekwojcik.pl>
2026-01-14 20:53:46 +01:00
98e5e1891a Release v25.12.04
All checks were successful
CI / Checks (push) Successful in 2m14s
Production deployment / Build (release) Successful in 26s
Staging deployment / Build (release) Successful in 50s
Staging deployment / Deploy (release) Successful in 1m19s
Production deployment / Deploy (release) Successful in 2m17s
2025-12-04 20:57:48 +01:00
06343e6ed3 BTHLABS-0000: Tweaking association card's layout 2025-12-04 20:55:55 +01:00
82a3b612ec BTHLABS-0000: Fix YT embed code 2025-12-04 20:46:38 +01:00
12 changed files with 57 additions and 16 deletions

View File

@@ -8,7 +8,7 @@ hotpocket_app:
node: "home.vm.snakeweb.net" node: "home.vm.snakeweb.net"
docker: docker:
extra_hosts: extra_hosts:
- "home.vm:10.0.1.2" - "home.vm:10.16.1.100"
backend: backend:
image_tag: "{{ hotpocket_app_image_tag|default('deployment-v25.10.21-01') }}" image_tag: "{{ hotpocket_app_image_tag|default('deployment-v25.10.21-01') }}"
database: database:

View File

@@ -1,4 +1,4 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import annotations from __future__ import annotations
version = '25.11.26' version = '26.1.14.post0'

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

View File

@@ -16,7 +16,7 @@
{% endif %} {% endif %}
</div> </div>
<div class="card-footer d-flex align-items-center"> <div class="card-footer d-flex align-items-center">
<a href="{{ association.target.url }}" target="_blank" rel="noopener noreferrer"><small>{{ association.target.url|render_url_domain }}</small></a> <a href="{{ association.target.url }}" target="_blank" rel="noopener noreferrer"><small>{{ association.target.url|render_url_domain }} <i class="bi bi-box-arrow-up-right"></i></small></a>
<div class="ms-auto flex-shrink-0 d-flex align-items-center"> <div class="ms-auto flex-shrink-0 d-flex align-items-center">
{% if not association.archived_at %} {% if not association.archived_at %}
<div class="spinner-border spinner-border-sm ui-htmx-indicator" role="status"> <div class="spinner-border spinner-border-sm ui-htmx-indicator" role="status">

View File

@@ -2,10 +2,24 @@
{% load i18n static ui %} {% load i18n static ui %}
{% block title %}{{ association.title }}{% endblock %} {% block title %}{% if association.title %}{{ association.title }}{% else %}{{ association.target.url }}{% endif %}{% endblock %}
{% block button_bar_class %}d-none{% endblock %} {% block button_bar_class %}d-none{% endblock %}
{% block page_head %}
{{ block.super}}
<meta property="og:title" content="{% if association.title %}{{ association.title }}{% else %}{{ association.target.url }}{% endif %}">
{% if association.description %}
<meta property="og:description" content="{{ association.description|truncatechars:125 }}">
{% endif %}
<meta property="og:image" content="{{ og_card_url }}">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="og:url" content="{{ share_url }}">
<meta property="og:type" content="website">
<meta property="og:site_name" content="{{ SITE_TITLE }}">
{% endblock %}
{% block page_body %} {% block page_body %}
<div id="ViewAssociationView" class="container pb-3"> <div id="ViewAssociationView" class="container pb-3">
<p class="display-3 mt-3 mb-0 text-center"> <p class="display-3 mt-3 mb-0 text-center">

View File

@@ -3,11 +3,13 @@
{% if save.is_youtube_video %} {% if save.is_youtube_video %}
<div class="mb-0 d-flex justify-content-center"> <div class="mb-0 d-flex justify-content-center">
<iframe <iframe
allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allow="accelerometer *; clipboard-write *; encrypted-media *; gyroscope *; picture-in-picture *; web-share *;"
allowfullscreen allowfullscreen
class="ui-youtube-iframe" class="ui-youtube-iframe"
frameborder="0" frameborder="0"
height="200" height="200"
referrerpolicy="strict-origin"
scrolling="no"
src="{{ save|render_youtube_embed_url }}" src="{{ save|render_youtube_embed_url }}"
title="YouTube video player" title="YouTube video player"
width="320" width="320"

View File

@@ -8,6 +8,7 @@ from django.contrib import messages
import django.db import django.db
from django.http import HttpRequest, HttpResponse, JsonResponse from django.http import HttpRequest, HttpResponse, JsonResponse
from django.shortcuts import redirect, render from django.shortcuts import redirect, render
from django.templatetags.static import static
from django.urls import reverse from django.urls import reverse
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.views.generic import FormView, View from django.views.generic import FormView, View
@@ -198,12 +199,18 @@ def view(request: HttpRequest, pk: uuid.UUID) -> HttpResponse:
if is_share is True: if is_share is True:
show_controls = show_controls and False show_controls = show_controls and False
share_url = reverse( share_url = request.build_absolute_uri(
reverse(
'ui.associations.view', 'ui.associations.view',
args=(association.pk,), args=(association.pk,),
query=[ query=[
('share', 'true'), ('share', 'true'),
], ],
),
)
og_card_url = request.build_absolute_uri(
static('ui/img/og-card.png'),
) )
return render( return render(
@@ -213,6 +220,12 @@ def view(request: HttpRequest, pk: uuid.UUID) -> HttpResponse:
'association': association, 'association': association,
'show_controls': show_controls, 'show_controls': show_controls,
'share_url': share_url, 'share_url': share_url,
'is_share': is_share,
'og_card_url': (
og_card_url
if is_share is True
else None
),
}, },
) )

View File

@@ -13,7 +13,7 @@ cat <<EOF
|_| |_|
production production
HotPocket v25.11.26 [${HOTPOCKET_BACKEND_IMAGE_ID}] (https://hotpocket.app/) HotPocket v26.1.14.post0 [${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": "25.11.26", "version": "26.1.14.post0",
"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 = "25.11.26" version = "26.1.14.post0"
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

@@ -103,7 +103,7 @@ def ci(ctx: Context):
@task @task
def setup(ctx: Context): def setup(ctx: Context):
ctx.run('python manage.py migrate') ctx.run('python manage.py migrate')
ctx.run('python manage.py create_initial_account hotpocket hotpocketm4st3r') ctx.run('python manage.py create_initial_account -u hotpocket -p hotpocketm4st3r')
if WORKSPACE_MODE == WorkspaceMode.METAL: if WORKSPACE_MODE == WorkspaceMode.METAL:
ctx.run('mkdir -p run/uploads') ctx.run('mkdir -p run/uploads')

View File

@@ -28,13 +28,15 @@ def test_authenticated_ok(authenticated_client: Client,
assert result.context['association'].target.pk == association_out.target.pk assert result.context['association'].target.pk == association_out.target.pk
assert result.context['show_controls'] is True assert result.context['show_controls'] is True
assert 'share_url' in result.context assert 'share_url' in result.context
assert result.context['is_share'] is False
assert result.context['og_card_url'] is None
expected_share_url = reverse( expected_share_url = reverse(
'ui.associations.view', 'ui.associations.view',
args=(association_out.pk,), args=(association_out.pk,),
query=[('share', 'true')], query=[('share', 'true')],
) )
assert result.context['share_url'] == expected_share_url assert result.context['share_url'].endswith(expected_share_url)
@pytest.mark.django_db @pytest.mark.django_db
@@ -126,6 +128,16 @@ def test_authenticated_share_ok(authenticated_client: Client,
assert hasattr(result.context['association'], 'target') is True assert hasattr(result.context['association'], 'target') is True
assert result.context['association'].target.pk == other_account_association_out.target.pk assert result.context['association'].target.pk == other_account_association_out.target.pk
assert result.context['show_controls'] is False assert result.context['show_controls'] is False
assert 'share_url' in result.context
assert result.context['is_share'] is True
assert result.context['og_card_url'] is not None
expected_share_url = reverse(
'ui.associations.view',
args=(other_account_association_out.pk,),
query=[('share', 'true')],
)
assert result.context['share_url'].endswith(expected_share_url)
@pytest.mark.django_db @pytest.mark.django_db