class UserIdentities(Persistent): def __init__(self, userid): self.userid = userid self._identities = PersistentDict() self._sheet = None self._secret = str(uuid.uuid4()) @property def secret(self): return self._secret def check_password(self, password): return password == self._secret def handle_result(self, result): """add a authomatic result to this user """ self._sheet = None # invalidate property sheet self._identities[result.provider.name] = UserIdentity(result) def identity(self, provider): """users identity at a distinct provider """ return self._identities.get(provider, None) def providers(self): """List linked providers """ return self._identities.keys() def unlink(self, provider): return self._identities.pop(provider) def update_userdata(self, result): self._sheet = None # invalidate property sheet identity = self._identities[result.provider.name] identity.update(result.user.to_dict()) @property def propertysheet(self): if self._sheet is not None: return self._sheet # build sheet from identities pdata = dict(id=self.userid) cfgs_providers = authomatic_cfg() for provider_name in cfgs_providers: identity = self.identity(provider_name) if identity is None: continue logger.debug(identity) cfg = cfgs_providers[provider_name] for akey, pkey in cfg.get('propertymap', {}).items(): # Always search first on the user attributes, then on the raw # data this guaratees we do not break existing configurations ainfo = identity.get(akey, identity['data'].get(akey, None)) if ainfo is None: continue if isinstance(pkey, dict): for k, v in pkey.items(): pdata[k] = ainfo.get(v) else: pdata[pkey] = ainfo self._sheet = UserPropertySheet(**pdata) return self._sheet
class NyLocalizedBFile(NyContentData, NyAttributes, NyItem, NyCheckControl, NyValidation, NyContentType): """ """ implements(INyBFile) meta_type = config['meta_type'] meta_label = config['label'] manage_options = ( {'label': 'Properties', 'action': 'manage_edit_html'}, {'label': 'Edit', 'action': 'manage_main'}, {'label': 'View', 'action': 'index_html'}, ) + NyItem.manage_options security = ClassSecurityInfo() def __init__(self, id, contributor): self.id = id NyContentData.__init__(self) NyValidation.__dict__['__init__'](self) NyCheckControl.__dict__['__init__'](self) NyItem.__dict__['__init__'](self) self.contributor = contributor self._versions = PersistentDict() security.declarePrivate('current_version') @property def current_version(self): language = self.get_selected_language() hasKey = self._versions.has_key(language) if hasKey == True: _versions = self._versions[language] for ver in reversed(_versions): if not ver.removed: return ver else: return None security.declareProtected(view, 'current_version_download_url') def current_version_download_url(self): language = self.get_selected_language() versions = self._versions_for_tmpl(language) if versions: return versions[-1]['url'] else: return None security.declarePrivate('remove_version') def remove_version(self, number, language, removed_by=None): if (not self._versions[language]) or (not self._versions[language][number]): raise ValueError # pick a random error ver = self._versions[language][number] if ver.removed: return ver.removed = True ver.removed_by = removed_by ver.removed_at = datetime.utcnow() ver.size = None f = ver.open_write() f.write('') f.close() def _save_file(self, the_file, language, contributor): """ """ bf = make_blobfile(the_file, removed=False, timestamp=datetime.utcnow(), contributor=contributor) _versions = self._versions.pop(language, None) if _versions == None: toAdd = [bf] newD = {language:toAdd} self._versions.update(newD) else: _versions.append(bf) newD = {language:_versions} self._versions.update(newD) def _versions_for_tmpl(self, language): """ """ hasKey = self._versions.has_key(language) if hasKey == True: _versions = self._versions[language] versions = [tmpl_version(self, ver, str(n+1)) for n, ver in enumerate(_versions) if not ver.removed] if versions: versions[-1]['is_current'] = True return versions else: return None security.declareProtected(view, 'index_html') def index_html(self, REQUEST=None, RESPONSE=None): """ """ language = self.get_selected_language() versions = self._versions_for_tmpl(language) options = {'versions': versions} if versions: options['current_version'] = versions[-1] template_vars = {'here': self, 'options': options} to_return = self.getFormsTool().getContent(template_vars, 'localizedbfile_index') return to_return def isVersionable(self): """ Localized BFiles are not versionable""" return False security.declareProtected(PERMISSION_EDIT_OBJECTS, 'saveProperties') def saveProperties(self, REQUEST=None, **kwargs): """ """ if not self.checkPermissionEditObject(): raise EXCEPTION_NOTAUTHORIZED, EXCEPTION_NOTAUTHORIZED_MSG if REQUEST is not None: schema_raw_data = dict(REQUEST.form) else: schema_raw_data = kwargs _lang = schema_raw_data.pop('_lang', schema_raw_data.pop('lang', None)) _releasedate = self.process_releasedate(schema_raw_data.pop('releasedate', ''), self.releasedate) _uploaded_file = schema_raw_data.pop('uploaded_file', None) versions_to_remove = schema_raw_data.pop('versions_to_remove', []) form_errors = self.process_submitted_form(schema_raw_data, _lang, _override_releasedate=_releasedate) if form_errors: if REQUEST is not None: self._prepare_error_response(REQUEST, form_errors, schema_raw_data) REQUEST.RESPONSE.redirect('%s/edit_html?lang=%s' % (self.absolute_url(), _lang)) return else: raise ValueError(form_errors.popitem()[1]) # pick a random error contributor = self.REQUEST.AUTHENTICATED_USER.getUserName() for ver_id in reversed(versions_to_remove): self.remove_version(int(ver_id) - 1, _lang, contributor) self._p_changed = 1 self.recatalogNyObject(self) #log date auth_tool = self.getAuthenticationTool() auth_tool.changeLastPost(contributor) if file_has_content(_uploaded_file): self._save_file(_uploaded_file, _lang, contributor) notify(NyContentObjectEditEvent(self, contributor)) if REQUEST: self.setSessionInfoTrans(MESSAGE_SAVEDCHANGES, date=self.utGetTodayDate()) REQUEST.RESPONSE.redirect('%s/edit_html?lang=%s' % (self.absolute_url(), _lang)) security.declareProtected(PERMISSION_EDIT_OBJECTS, 'edit_html') def edit_html(self, REQUEST=None, RESPONSE=None): """ """ hasKey = REQUEST.form.has_key('lang') if hasKey == False: language = self.get_selected_language() else: language = REQUEST.form['lang'] options = {'versions': self._versions_for_tmpl(language)} template_vars = {'here': self, 'options': options} to_return = self.getFormsTool().getContent(template_vars, 'localizedbfile_edit') return to_return security.declareProtected(view, 'download') download = CaptureTraverse(localizedbfile_download)
class NyLocalizedBFile(NyContentData, NyAttributes, NyItem, NyCheckControl, NyValidation, NyContentType): """ """ implements(INyBFile) meta_type = config['meta_type'] meta_label = config['label'] manage_options = ( { 'label': 'Properties', 'action': 'manage_edit_html' }, { 'label': 'Edit', 'action': 'manage_main' }, { 'label': 'View', 'action': 'index_html' }, ) + NyItem.manage_options security = ClassSecurityInfo() def __init__(self, id, contributor): self.id = id NyContentData.__init__(self) NyValidation.__dict__['__init__'](self) NyCheckControl.__dict__['__init__'](self) NyItem.__dict__['__init__'](self) self.contributor = contributor self._versions = PersistentDict() security.declarePrivate('current_version') @property def current_version(self): language = self.get_selected_language() hasKey = self._versions.has_key(language) if hasKey == True: _versions = self._versions[language] for ver in reversed(_versions): if not ver.removed: return ver else: return None security.declareProtected(view, 'current_version_download_url') def current_version_download_url(self): language = self.get_selected_language() versions = self._versions_for_tmpl(language) if versions: return versions[-1]['url'] else: return None security.declarePrivate('remove_version') def remove_version(self, number, language, removed_by=None): if (not self._versions[language]) or ( not self._versions[language][number]): raise ValueError # pick a random error ver = self._versions[language][number] if ver.removed: return ver.removed = True ver.removed_by = removed_by ver.removed_at = datetime.utcnow() ver.size = None f = ver.open_write() f.write('') f.close() def _save_file(self, the_file, language, contributor): """ """ bf = make_blobfile(the_file, removed=False, timestamp=datetime.utcnow(), contributor=contributor) _versions = self._versions.pop(language, None) if _versions == None: toAdd = [bf] newD = {language: toAdd} self._versions.update(newD) else: _versions.append(bf) newD = {language: _versions} self._versions.update(newD) def _versions_for_tmpl(self, language): """ """ hasKey = self._versions.has_key(language) if hasKey == True: _versions = self._versions[language] versions = [ tmpl_version(self, ver, str(n + 1)) for n, ver in enumerate(_versions) if not ver.removed ] if versions: versions[-1]['is_current'] = True return versions else: return None security.declareProtected(view, 'index_html') def index_html(self, REQUEST=None, RESPONSE=None): """ """ language = self.get_selected_language() versions = self._versions_for_tmpl(language) options = {'versions': versions} if versions: options['current_version'] = versions[-1] template_vars = {'here': self, 'options': options} to_return = self.getFormsTool().getContent(template_vars, 'localizedbfile_index') return to_return def isVersionable(self): """ Localized BFiles are not versionable""" return False security.declareProtected(PERMISSION_EDIT_OBJECTS, 'saveProperties') def saveProperties(self, REQUEST=None, **kwargs): """ """ if not self.checkPermissionEditObject(): raise EXCEPTION_NOTAUTHORIZED, EXCEPTION_NOTAUTHORIZED_MSG if REQUEST is not None: schema_raw_data = dict(REQUEST.form) else: schema_raw_data = kwargs _lang = schema_raw_data.pop('_lang', schema_raw_data.pop('lang', None)) _releasedate = self.process_releasedate( schema_raw_data.pop('releasedate', ''), self.releasedate) _uploaded_file = schema_raw_data.pop('uploaded_file', None) versions_to_remove = schema_raw_data.pop('versions_to_remove', []) form_errors = self.process_submitted_form( schema_raw_data, _lang, _override_releasedate=_releasedate) if form_errors: if REQUEST is not None: self._prepare_error_response(REQUEST, form_errors, schema_raw_data) REQUEST.RESPONSE.redirect('%s/edit_html?lang=%s' % (self.absolute_url(), _lang)) return else: raise ValueError( form_errors.popitem()[1]) # pick a random error contributor = self.REQUEST.AUTHENTICATED_USER.getUserName() for ver_id in reversed(versions_to_remove): self.remove_version(int(ver_id) - 1, _lang, contributor) self._p_changed = 1 self.recatalogNyObject(self) #log date auth_tool = self.getAuthenticationTool() auth_tool.changeLastPost(contributor) if file_has_content(_uploaded_file): self._save_file(_uploaded_file, _lang, contributor) notify(NyContentObjectEditEvent(self, contributor)) if REQUEST: self.setSessionInfoTrans(MESSAGE_SAVEDCHANGES, date=self.utGetTodayDate()) REQUEST.RESPONSE.redirect('%s/edit_html?lang=%s' % (self.absolute_url(), _lang)) security.declareProtected(PERMISSION_EDIT_OBJECTS, 'edit_html') def edit_html(self, REQUEST=None, RESPONSE=None): """ """ hasKey = REQUEST.form.has_key('lang') if hasKey == False: language = self.get_selected_language() else: language = REQUEST.form['lang'] options = {'versions': self._versions_for_tmpl(language)} template_vars = {'here': self, 'options': options} to_return = self.getFormsTool().getContent(template_vars, 'localizedbfile_edit') return to_return security.declareProtected(view, 'download') download = CaptureTraverse(localizedbfile_download)