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