Files
forms/app/repositories/form_repository.py
2026-04-09 19:28:41 +03:00

98 lines
3.4 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from typing import Optional, List, Dict, Any
from sqlalchemy.orm import Session
from sqlalchemy import and_, or_
from app.repositories.base import BaseRepository
from app.models.form import Form, FormField, Field
class FormRepository(BaseRepository[Form]):
def __init__(self, db: Session):
super().__init__(db, Form)
def get_by_name(self, name: str) -> Optional[Form]:
"""Получить форму по имени"""
return self.db.query(Form).filter(Form.name == name).first()
def get_active_forms(self, skip: int = 0, limit: int = 100) -> List[Form]:
"""Получить активные формы"""
return self.db.query(Form).filter(
Form.is_active == True,
Form.is_published == True
).offset(skip).limit(limit).all()
def get_forms_with_submissions_count(self) -> List[Dict[str, Any]]:
"""Получить формы с количеством submissions"""
from app.models.submission import Submission
results = self.db.query(
Form.id,
Form.name,
Form.description,
Form.created_at,
func.count(Submission.id).label('submissions_count')
).outerjoin(
Submission, Form.id == Submission.form_id
).group_by(
Form.id
).all()
return [
{
"id": r.id,
"name": r.name,
"description": r.description,
"created_at": r.created_at,
"submissions_count": r.submissions_count
}
for r in results
]
def clone_form(self, form_id: int, new_name: str) -> Optional[Form]:
"""Клонировать форму со всеми полями"""
original_form = self.get_by_id(form_id)
if not original_form:
return None
# Клонируем форму
cloned_form = Form(
name=new_name,
description=original_form.description,
settings=original_form.settings,
is_active=False,
is_published=False
)
self.db.add(cloned_form)
self.db.flush()
# Клонируем связи с полями
for form_field in original_form.fields:
new_form_field = FormField(
form_id=cloned_form.id,
field_id=form_field.field_id,
order=form_field.order,
is_required=form_field.is_required,
default_value=form_field.default_value,
visibility_conditions=form_field.visibility_conditions,
validation_rules_override=form_field.validation_rules_override
)
self.db.add(new_form_field)
self.db.commit()
self.db.refresh(cloned_form)
return cloned_form
class FieldRepository(BaseRepository[Field]):
def __init__(self, db: Session):
super().__init__(db, Field)
def get_by_name(self, name: str) -> Optional[Field]:
"""Получить поле по имени"""
return self.db.query(Field).filter(Field.name == name).first()
def get_or_create_field(self, field_data: Dict[str, Any]) -> Field:
"""Получить или создать поле"""
field = self.get_by_name(field_data.get("name"))
if not field:
field = self.create(field_data)
return field