source: products/quintagroup.referencedatagridfield/trunk/quintagroup/referencedatagridfield/_field.py @ 2285

Last change on this file since 2285 was 2282, checked in by mylan, 14 years ago

Hide UID column

  • Property svn:eol-style set to native
File size: 5.8 KB
RevLine 
[2259]1#from Products.Archetypes import atapi
[2263]2import re
[2260]3import logging
[2263]4import urlparse
5from urllib import quote
6from types import ListType, TupleType
7
[2260]8from AccessControl import ClassSecurityInfo
[2263]9
10from Products.CMFCore.utils import getToolByName
11from Products.validation import validation #validators import baseValidators
[2266]12from Products.Archetypes.Field import encode, ReferenceField
[2259]13from Products.Archetypes.Registry import registerField, registerWidget
14
[2266]15from Products.ATReferenceBrowserWidget.ATReferenceBrowserWidget import ReferenceBrowserWidget
16
[2282]17from Products.DataGridField.Column import Column
[2259]18from Products.DataGridField.DataGridField import DataGridField
19from Products.DataGridField.DataGridWidget import DataGridWidget
20
[2282]21from hiddencolumn import HiddenColumn
[2263]22
[2260]23# Logger object
24#logger = logging.getLogger('ReferenceDataGridField')
25#logger.debug("ReferenceDataGrid loading")
26
[2266]27class ReferenceDataGridWidget(DataGridWidget, ReferenceBrowserWidget):
28    _properties = ReferenceBrowserWidget._properties.copy()
29    _properties.update(DataGridWidget._properties.copy())
[2260]30    _properties.update({
[2266]31        'macro': "referencedatagridwidget",
32        'helper_css': ('datagridwidget.css',),
33        'helper_js': ('referencebrowser.js', 'datagridwidget.js',),
[2274]34        'force_close_on_insert': True,
[2282]35        'columns': {
36            'title': Column("Title"), 
37            'link': Column("Link"),
38            'uid': HiddenColumn("UID", visible=False)},
[2260]39        })
[2259]40
[2263]41isURL = validation.validatorFor('isURL')
42
[2266]43class ReferenceDataGridField(DataGridField, ReferenceField):
44    _properties = ReferenceField._properties.copy()
45    _properties.update(DataGridField._properties.copy())
[2259]46    _properties.update({
[2278]47        'columns': ('title', 'link', 'uid'),
[2259]48        'widget': ReferenceDataGridWidget,
[2274]49        'multiValued' : True,
[2259]50        })
51
[2263]52    security = ClassSecurityInfo()
53
54    security.declarePrivate('isRemoteURL')
55    def isRemoteURL(self, url):
[2264]56        return isURL(url) == 1 and True or False
[2263]57
58    security.declarePrivate('set')
59    def set(self, instance, value, **kwargs):
60        """
61        The passed in object should be a records object, or a sequence of dictionaries
[2278]62        About link data:
[2263]63          * interpretations:
[2278]64            * if data not starts with standard protocol names (http://, ftp://) than
65              *uid* field data will be used as reference
[2263]66          * record removed if:
67            * no data;
68            * data contains UID of not existent object
69        About title:
[2278]70          * if there is UID of existent object and record has same title to the original
71            object - title will not be saved.
[2263]72        """
73        catalog = getToolByName(instance, "uid_catalog")
74
75        if value is None:
76            value = ()
77
78        if not isinstance(value, (ListType, TupleType)):
79            value = value,
80
81        result = []
82        for row in value:
[2278]83            data = {"title":"", "link":"", "uid":""}
[2263]84
[2278]85            uid = str(row.get("uid", "")).strip()
86            link = str(row.get("link", "")).strip()
[2263]87            title = str(row.get('title', "")).strip()
[2278]88
[2263]89            if not title == "":
90                data["title"] = title
91
[2278]92            if link == "":
[2263]93                continue
[2278]94            elif self.isRemoteURL(link):
95                data["link"] = urlparse.urlunparse(urlparse.urlparse(link))
[2263]96            else:
[2278]97                if uid == '':
98                    continue
99
100                brains = catalog(UID=uid)
[2263]101                if len(brains) == 0:
102                    continue
[2274]103                # Found objects with pointed UID
104                brain = brains[0]
[2278]105                data["uid"] = uid
106                # Fix title for uid
107                if data['title'] == getattr(brain, "Title", ""):
108                    data['title'] = ""
[2263]109            result.append(data)
110
111        DataGridField.set(self, instance, result, **kwargs)
[2278]112
113        uids = [r['uid'] for r in result if r['uid']!=""]
[2274]114        ReferenceField.set(self, instance, uids, **kwargs)
115       
[2263]116    security.declarePrivate('get')
117    def get(self, instance, **kwargs):
118        """ Return DataGridField value
119
120        Value is a list object of rows.
[2278]121        Row id dictionary object with standard 'link', 'uid' and 'title' keys
122        plus extra informal *url* and *url_title* keys
[2263]123        """
124        purl = getToolByName(instance, "portal_url")
[2278]125        # use portal_catalog to hide protected object for the logged in user.
[2275]126        catalog = getToolByName(instance, "portal_catalog")
[2263]127
128        result = []
[2275]129        uids = {}
[2263]130        rows = DataGridField.get(self, instance, **kwargs)
131        for row in rows:
[2276]132            result.append({
133                # DataGridField row data
[2278]134                "uid": row["uid"],
135                "link": row["link"],
[2276]136                "title": row["title"],
137                # View data
[2281]138                "url": ""})
[2275]139            data = result[-1]
140            # Process remote URL and collect UIDs
[2278]141            if row["link"]:
142                data["url"] = quote(row["link"], safe='?$#@/:=+;$,&%')
[2275]143                # if title not set for remote url - set it equals to url
[2281]144                if not data["title"]:
145                    data["title"] = row["link"]
[2263]146            else:
[2278]147                uids[row["uid"]] = data
[2275]148        # Process UIDs
149        if uids:
150            brains = catalog(UID=uids.keys())
151            for b in brains:
152                data = uids[b.UID]
[2278]153                data["url"] = b.getURL()
[2281]154                data["link"] = b.getPath()
[2275]155                # If title not set - get it from the brain
[2281]156                if not data["title"]:
157                    data["title"] = self._brains_title_or_id(b, instance)
[2263]158
159        return result
160
[2274]161
[2259]162registerWidget(
163    ReferenceDataGridWidget,
164    title='DataGrid Reference',
165    used_for=('quintagroup.referencedatagridfield.ReferenceDataGridField',)
166    )
167
168registerField(
169    ReferenceDataGridField,
170    title="DataGrid Reference Field",
171    description=("Reference DataGrid field.")
172    )
Note: See TracBrowser for help on using the repository browser.