Реалізація автоматичного оновлення правових документів при змінах законів
Правові документи — політика конфіденційності, умови користування, Cookie Policy — мають актуалізуватися при змінах застосовного законодавства. Система автооновлення мінімізує юридичні ризики.
Проблема статичних документів
Більшість сайтів створюють правові документи один раз і забувають про них. Зміни GDPR, ePrivacy Directive, CCPA та поява нових законів вимагають оновлення документів.
Наслідки застарілих документів: штрафи регуляторів, претензії користувачів, неможливість використання в суді як доказу згоди.
Архітектура системи автооновлення
Варіант 1: Managed SaaS (рекомендується)
iubenda, Termly, CookieBot — підтримують автоматичне оновлення шаблонів при змінах законодавства. Документи вбудовуються через widget і оновлюються на стороні сервісу.
Варіант 2: Версіонування документів
# models.py
class LegalDocument(BaseModel):
type: str # 'privacy_policy', 'terms', 'cookie_policy'
version: str # 'v2024-03-01'
content: str # Markdown/HTML контент
language: str # 'ua', 'en', 'de'
effective_from: datetime
requires_reacceptance: bool # Чи потрібна повторна згода
change_summary: str # Що змінилось (для сповіщення)
class UserConsent(BaseModel):
user_id: int
document_type: str
document_version: str
accepted_at: datetime
ip_address: str
user_agent: str
Варіант 3: Git-based версіонування
/legal/
├── privacy_policy/
│ ├── v2022-01-01.ua.md
│ ├── v2023-07-15.ua.md # Оновлення при змінах GDPR
│ └── v2024-03-01.ua.md # Поточна
├── terms/
│ ├── v2022-01-01.ua.md
│ └── v2024-01-10.ua.md
└── changelog.yml
Система сповіщень при зміні версії
class LegalDocumentUpdater:
def publish_new_version(self, doc_type: str, new_content: str,
change_summary: str, requires_reacceptance: bool):
version = datetime.now().strftime('v%Y-%m-%d')
# Зберегти нову версію
doc = LegalDocument(
type=doc_type,
version=version,
content=new_content,
effective_from=datetime.now() + timedelta(days=30), # сповістити за 30 днів
requires_reacceptance=requires_reacceptance,
change_summary=change_summary
)
db.save(doc)
if requires_reacceptance:
self._notify_users(doc)
def _notify_users(self, doc: LegalDocument):
# Знайти користувачів, які прийняли попередню версію
affected_users = db.query("""
SELECT DISTINCT u.id, u.email
FROM users u
JOIN user_consents uc ON u.id = uc.user_id
WHERE uc.document_type = %s
AND uc.document_version != %s
""", (doc.type, doc.version))
for user in affected_users:
send_email(
to=user['email'],
subject="Оновлення правових документів",
template="legal_update_notification",
vars={
'doc_type': doc.type,
'change_summary': doc.change_summary,
'effective_date': doc.effective_from.strftime('%d.%m.%Y'),
'review_url': f"https://site.com/legal/{doc_type}",
'accept_url': f"https://site.com/legal/accept?doc={doc_type}&v={doc.version}"
}
)
Примусова повторна згода
При суттєвих змінах користувач повинен явно прийняти нову версію:
class LegalAcceptanceMiddleware:
def __call__(self, request):
if not request.user.is_authenticated:
return self.app(request)
current_versions = get_current_document_versions()
for doc_type, current_version in current_versions.items():
user_consent = db.get_latest_consent(request.user.id, doc_type)
if not user_consent or user_consent.version != current_version:
# Перевірити вимагає ли версія повторної згоди
doc = db.get_document(doc_type, current_version)
if doc.requires_reacceptance:
# Редирект на сторінку прийняття
return redirect(f'/legal/accept?doc={doc_type}')
return self.app(request)
Моніторинг змін законодавства
# Підписка на оновлення через RSS/email від регуляторів
REGULATORY_SOURCES = [
'https://edpb.europa.eu/news/news_en.rss', # EDPB (GDPR)
'https://ico.org.uk/news-events/news/rss', # UK ICO
]
def check_regulatory_updates():
import feedparser
for source in REGULATORY_SOURCES:
feed = feedparser.parse(source)
for entry in feed.entries[:5]: # останні 5 новин
if any(kw in entry.title.lower() for kw in
['gdpr', 'personal data', 'privacy']):
notify_legal_team(entry.title, entry.link)
Audit Log згод
-- Повна історія згод для доказу compliance
CREATE TABLE consent_audit_log (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL,
document_type VARCHAR(50) NOT NULL,
document_version VARCHAR(20) NOT NULL,
action VARCHAR(20) NOT NULL, -- 'accepted', 'rejected', 'withdrawn'
accepted_at TIMESTAMPTZ DEFAULT NOW(),
ip_address INET,
user_agent TEXT,
consent_method VARCHAR(50), -- 'checkbox', 'banner', 'api'
-- Незмінна запис
CONSTRAINT no_update CHECK (TRUE)
);
CREATE INDEX idx_consent_log_user ON consent_audit_log(user_id, document_type);
Строк виконання
Реалізація системи версіонування документів з сповіщеннями та примусовою згодою — 3–5 робочих днів.







