v1.8.5: fix onupdate NOW() → func.now(), удалён main-header, правила по Идеям, синхронизация версии в контейнере
Tests / test (push) Has been cancelled
Tests / test-max-bot (push) Has been cancelled

This commit is contained in:
2026-06-02 20:57:46 +03:00
parent e184e5fe79
commit b2a270cb2e
8 changed files with 39 additions and 40 deletions
+11
View File
@@ -1,5 +1,16 @@
# Changelog — AegisOne Service Portal
## 1.8.5 (02.06.2026)
### Новые функции
- **AGENTS.md (раздел 12):** правила по Идеям — агент может видеть, добавлять, менять статус, предлагать к реализации, реализовывать
### Исправления
- **models.py:** `onupdate="NOW()"``onupdate=func.now()` — fix Internal Server Error при смене статуса Идеи (14 моделей)
- **page.html:** удалён `main-header` (заголовок + дата) — больше не дублируется на всех страницах
- **dashboard.html:** удалён `main-header`
- **bot_dialogues.html:** удалён CSS `.main-header { display: none !important; }` (больше не нужен)
- **version.txt / CHANGELOG.md:** синхронизация версии в контейнере aegisone-app
## 1.8.4 (02.06.2026)
### Новые функции
- **SERVICE_STYLE_GUIDE.md:** единый гайд стилей сервисного портала
+15 -15
View File
@@ -10,7 +10,7 @@ ORM-модели для service portal (SQLAlchemy 2.0).
"""
from datetime import datetime
from sqlalchemy import (
Column, Integer, String, Boolean, Text, DateTime, Numeric, Date, BigInteger, SmallInteger, JSON, ForeignKey, CheckConstraint
Column, Integer, String, Boolean, Text, DateTime, Numeric, Date, BigInteger, SmallInteger, JSON, ForeignKey, CheckConstraint, func
)
from sqlalchemy.orm import relationship, declarative_base
@@ -30,7 +30,7 @@ class User(Base):
max_user_id = Column(BigInteger, nullable=True)
is_active = Column(Boolean, nullable=False, default=True)
created_at = Column(DateTime, nullable=False, server_default="NOW()")
updated_at = Column(DateTime, nullable=False, server_default="NOW()", onupdate="NOW()")
updated_at = Column(DateTime, nullable=False, server_default="NOW()", onupdate=func.now())
__table_args__ = (
CheckConstraint("role IN ('owner','engineer','technician')", name="ck_users_role"),
@@ -76,7 +76,7 @@ class Customer(Base):
notes = Column(Text)
created_by = Column(Integer, ForeignKey("users.id", ondelete="SET NULL"))
created_at = Column(DateTime, nullable=False, server_default="NOW()")
updated_at = Column(DateTime, nullable=False, server_default="NOW()", onupdate="NOW()")
updated_at = Column(DateTime, nullable=False, server_default="NOW()", onupdate=func.now())
__table_args__ = (
CheckConstraint("status IN ('active','inactive','prospect')", name="ck_customers_status"),
@@ -109,7 +109,7 @@ class Object(Base):
region_factor = Column(Numeric(3, 2), default=1.00)
created_by = Column(Integer, ForeignKey("users.id", ondelete="SET NULL"))
created_at = Column(DateTime, nullable=False, server_default="NOW()")
updated_at = Column(DateTime, nullable=False, server_default="NOW()", onupdate="NOW()")
updated_at = Column(DateTime, nullable=False, server_default="NOW()", onupdate=func.now())
__table_args__ = (
CheckConstraint("status IN ('active','inactive','audit','prospective')", name="ck_objects_status"),
@@ -163,7 +163,7 @@ class Task(Base):
result_notes = Column(Text)
closed_at = Column(DateTime)
created_at = Column(DateTime, nullable=False, server_default="NOW()")
updated_at = Column(DateTime, nullable=False, server_default="NOW()", onupdate="NOW()")
updated_at = Column(DateTime, nullable=False, server_default="NOW()", onupdate=func.now())
__table_args__ = (
CheckConstraint("priority IN ('P1','P2','P3','P4')", name="ck_tasks_priority"),
@@ -227,7 +227,7 @@ class Report(Base):
status = Column(String(20), nullable=False, default="draft")
client_confirmed = Column(Boolean, default=False)
created_at = Column(DateTime, nullable=False, server_default="NOW()")
updated_at = Column(DateTime, nullable=False, server_default="NOW()", onupdate="NOW()")
updated_at = Column(DateTime, nullable=False, server_default="NOW()", onupdate=func.now())
__table_args__ = (
CheckConstraint("report_type IN ('inspection','service','emergency','audit','monthly')", name="ck_reports_type"),
@@ -255,7 +255,7 @@ class QuestionnaireSession(Base):
object_index = Column(Numeric(5, 2), default=0)
sla_price_monthly = Column(Numeric(12, 2), default=0)
created_at = Column(DateTime, nullable=False, server_default="NOW()")
updated_at = Column(DateTime, nullable=False, server_default="NOW()", onupdate="NOW()")
updated_at = Column(DateTime, nullable=False, server_default="NOW()", onupdate=func.now())
__table_args__ = (
CheckConstraint("status IN ('draft','completed','cancelled')", name="ck_qsessions_status"),
@@ -293,7 +293,7 @@ class QuestionnaireItem(Base):
is_active = Column(Boolean, nullable=False, default=True)
help_text = Column(String(500), default="")
created_at = Column(DateTime, nullable=False, server_default="NOW()")
updated_at = Column(DateTime, nullable=False, server_default="NOW()", onupdate="NOW()")
updated_at = Column(DateTime, nullable=False, server_default="NOW()", onupdate=func.now())
__table_args__ = (
CheckConstraint("type IN ('text','number','select','radio','checkbox','textarea')", name="ck_qitems_type"),
@@ -340,7 +340,7 @@ class SLAContract(Base):
status = Column(String(20), nullable=False, default="negotiation")
created_by = Column(Integer, ForeignKey("users.id", ondelete="SET NULL"))
created_at = Column(DateTime, nullable=False, server_default="NOW()")
updated_at = Column(DateTime, nullable=False, server_default="NOW()", onupdate="NOW()")
updated_at = Column(DateTime, nullable=False, server_default="NOW()", onupdate=func.now())
__table_args__ = (
CheckConstraint("service_level IN ('start','business','enterprise')", name="ck_sla_level"),
@@ -369,7 +369,7 @@ class Incident(Base):
sla_breached = Column(Boolean, default=False)
resolved_at = Column(DateTime)
created_at = Column(DateTime, nullable=False, server_default="NOW()")
updated_at = Column(DateTime, nullable=False, server_default="NOW()", onupdate="NOW()")
updated_at = Column(DateTime, nullable=False, server_default="NOW()", onupdate=func.now())
__table_args__ = (
CheckConstraint("severity IN ('P1','P2','P3')", name="ck_incidents_severity"),
@@ -438,7 +438,7 @@ class BlogPost(Base):
status = Column(String(20), nullable=False, default="draft")
published_at = Column(DateTime)
created_at = Column(DateTime, nullable=False, server_default="NOW()")
updated_at = Column(DateTime, nullable=False, server_default="NOW()", onupdate="NOW()")
updated_at = Column(DateTime, nullable=False, server_default="NOW()", onupdate=func.now())
__table_args__ = (
CheckConstraint("category IN ('audit','sla','incident','supervision','documentation','risk','cases')", name="ck_blog_category"),
@@ -458,7 +458,7 @@ class FormulaCoefficient(Base):
formula_ref = Column(String(255), default="")
is_active = Column(Boolean, nullable=False, default=True)
updated_by = Column(Integer, ForeignKey("users.id", ondelete="SET NULL"))
updated_at = Column(DateTime, nullable=False, server_default="NOW()", onupdate="NOW()")
updated_at = Column(DateTime, nullable=False, server_default="NOW()", onupdate=func.now())
updater = relationship("User")
@@ -473,7 +473,7 @@ class Case(Base):
sort_order = Column(Integer, nullable=False, default=0)
is_active = Column(Boolean, nullable=False, default=True)
created_at = Column(DateTime, nullable=False, server_default="NOW()")
updated_at = Column(DateTime, nullable=False, server_default="NOW()", onupdate="NOW()")
updated_at = Column(DateTime, nullable=False, server_default="NOW()", onupdate=func.now())
class Idea(Base):
@@ -485,7 +485,7 @@ class Idea(Base):
status = Column(String(20), nullable=False, default="normal")
created_by = Column(Integer, ForeignKey("users.id", ondelete="SET NULL"))
created_at = Column(DateTime, nullable=False, server_default="NOW()")
updated_at = Column(DateTime, nullable=False, server_default="NOW()", onupdate="NOW()")
updated_at = Column(DateTime, nullable=False, server_default="NOW()", onupdate=func.now())
__table_args__ = (
CheckConstraint("status IN ('normal','in_progress','completed')", name="ck_ideas_status"),
@@ -503,7 +503,7 @@ class QuickMenuItem(Base):
url = Column(String(500), nullable=False)
sort_order = Column(Integer, nullable=False, default=0)
created_by = Column(Integer, ForeignKey("users.id", ondelete="SET NULL"))
updated_at = Column(DateTime, nullable=False, server_default="NOW()", onupdate="NOW()")
updated_at = Column(DateTime, nullable=False, server_default="NOW()", onupdate=func.now())
creator = relationship("User")
-10
View File
@@ -5,16 +5,6 @@
<div class="layout">
{% include "_sidebar.html" %}
<main class="main">
<div class="main-header">
<div>
<h1>Дашборд</h1>
<div class="breadcrumb"></div>
</div>
<div class="actions">
<span style="font-size:12px;color:var(--text-muted);">{{ now }}</span>
</div>
</div>
{% if shs_alert %}
<div class="shs-alert critical">⚠ {{ shs_alert }}</div>
{% endif %}
-12
View File
@@ -5,18 +5,6 @@
<div class="layout">
{% include "_sidebar.html" %}
<main class="main">
<div class="main-header">
<div>
<h1>{% block page_title %}{{ title|default(page_name|capitalize) }}{% endblock %}</h1>
<div class="breadcrumb">
{% block breadcrumb %}{% endblock %}
</div>
</div>
<div class="actions">
{% block page_actions %}{% endblock %}
<span style="font-size:12px;color:var(--text-muted);">{{ now }}</span>
</div>
</div>
{% block page_content %}{% endblock %}
</main>
</div>
@@ -86,7 +86,6 @@
#delete-modal .modal { max-width:420px; }
#delete-modal h2 { font-size:16px; margin-bottom:8px; }
#delete-modal p { color:var(--text-secondary); font-size:14px; }
.main-header { display: none !important; }
</style>
<script>
+1 -1
View File
@@ -1 +1 @@
1.8.4
1.8.5