| 1 | # -*- coding: utf-8 -*- |
|---|
| 2 | |
|---|
| 3 | from trac.resource import Resource, ResourceNotFound |
|---|
| 4 | |
|---|
| 5 | from api import FormSystem, _ |
|---|
| 6 | |
|---|
| 7 | __all__ = ['Form'] |
|---|
| 8 | |
|---|
| 9 | |
|---|
| 10 | class Form(object): |
|---|
| 11 | """Trac resource representation of a TracForms form.""" |
|---|
| 12 | |
|---|
| 13 | @staticmethod |
|---|
| 14 | def id_is_valid(num): |
|---|
| 15 | try: |
|---|
| 16 | return 0 < int(num) <= 1L << 31 |
|---|
| 17 | except ValueError: |
|---|
| 18 | raise ResourceNotFound( |
|---|
| 19 | _("TracForm %(form_id)s does not exist.", form_id=num), |
|---|
| 20 | _("Invalid form number")) |
|---|
| 21 | |
|---|
| 22 | def __init__(self, env, form_resource_or_parent_realm=None, |
|---|
| 23 | parent_id=None, subcontext=None, form_id=None, version=None): |
|---|
| 24 | self.env = env |
|---|
| 25 | # prepare db access |
|---|
| 26 | self.forms = FormSystem(env) |
|---|
| 27 | self.realm = 'form' |
|---|
| 28 | self.subcontext = subcontext |
|---|
| 29 | self.siblings = [] |
|---|
| 30 | # DEVEL: support for handling form revisions not implemented yet |
|---|
| 31 | if isinstance(form_resource_or_parent_realm, Resource): |
|---|
| 32 | self.resource = form_resource_or_parent_realm |
|---|
| 33 | parent = self.resource.parent |
|---|
| 34 | if self.siblings == []: |
|---|
| 35 | self._get_siblings(parent.realm, parent.id) |
|---|
| 36 | else: |
|---|
| 37 | parent_realm = form_resource_or_parent_realm |
|---|
| 38 | if form_id not in [None, ''] and self.id_is_valid(form_id): |
|---|
| 39 | self.id = int(form_id) |
|---|
| 40 | else: |
|---|
| 41 | self.id = None |
|---|
| 42 | if self.id is not None and (parent_realm is None or \ |
|---|
| 43 | parent_id is None or subcontext is None): |
|---|
| 44 | # get complete context, required as resource parent |
|---|
| 45 | ctxt = self.forms.get_tracform_meta(self.id)[1:4] |
|---|
| 46 | parent_realm = ctxt[0] |
|---|
| 47 | parent_id = ctxt[1] |
|---|
| 48 | self.subcontext = ctxt[2] |
|---|
| 49 | elif isinstance(parent_realm, basestring) and \ |
|---|
| 50 | parent_id is not None and self.id is None: |
|---|
| 51 | # find form(s), if parent descriptors are available |
|---|
| 52 | if subcontext is not None: |
|---|
| 53 | ctxt = tuple([parent_realm, parent_id, subcontext]) |
|---|
| 54 | self.id = self.forms.get_tracform_meta(ctxt)[0] |
|---|
| 55 | self._get_siblings(parent_realm, parent_id) |
|---|
| 56 | if isinstance(parent_realm, basestring) and \ |
|---|
| 57 | parent_id is not None: |
|---|
| 58 | self.resource = Resource(parent_realm, parent_id |
|---|
| 59 | ).child('form', self.id, version) |
|---|
| 60 | else: |
|---|
| 61 | raise ResourceNotFound( |
|---|
| 62 | _("""No data recorded for a TracForms form in |
|---|
| 63 | %(realm)s:%(parent_id)s |
|---|
| 64 | """, realm=parent_realm, parent_id=parent_id), |
|---|
| 65 | subcontext and _("with subcontext %(subcontext)s", |
|---|
| 66 | subcontext=subcontext) or '') |
|---|
| 67 | |
|---|
| 68 | def _get_siblings(self, parent_realm, parent_id): |
|---|
| 69 | """Add siblings list including self to form resource object.""" |
|---|
| 70 | self.siblings = self.forms.get_tracform_ids(tuple([parent_realm, |
|---|
| 71 | parent_id])) or [] |
|---|
| 72 | if len(self.siblings) == 1: |
|---|
| 73 | # form_id in single form situation |
|---|
| 74 | self.id = self.siblings[0][0] |
|---|
| 75 | self.subcontext = self.siblings[0][1] |
|---|
| 76 | |
|---|
| 77 | @property |
|---|
| 78 | def has_data(self): |
|---|
| 79 | """Return whether there is any form content stored.""" |
|---|
| 80 | return (self.forms.get_tracform_fields(self.id) is not None or \ |
|---|
| 81 | self.forms.get_tracform_history(self.id) is not None or \ |
|---|
| 82 | self.forms.get_tracform_state(self.id) not in [None, '{}']) |
|---|
| 83 | |
|---|