def download(request): suid = request.matchdict['suid'] rev = request.matchdict.get('rev') root = get_root() config = solr_config(root) query = Term('suid', suid) if rev: query = query & Term('revision', rev) else: query = query & Term('state', 'active') query = query & Term('visibility', 'anonymous') md = Metadata(config, SOLR_FIELDS) fl = 'effective,expires,physical_path,mimetype,filename' result = md.query(q=query, fl=fl) if len(result) != 1: raise MDBError(u'Dataset not found in SOLR. Query: %s' % query) md = result[0] if not chk_publication(md): raise MDBError(u'Item not effective or already expired') physical_path = u'/xsendfile%s.binary' % md['physical_path'] response = Response() response.content_type = md['mimetype'] response.content_disposition = \ 'attachment; filename=%s' % md['filename'] response.headers.add('X-Accel-Redirect', physical_path) return response
def search(request): root = get_root() config = solr_config(root) result = list() term = '%s*~' % request.matchdict['term'] query = Term('type', 'Media') \ & Group(Term('title', term) \ | Term('description', term) \ | Term('creator', term)) fl = 'uid,title,description,repository' for md in Metadata(config, SOLR_FIELDS).query(q=query, fl=fl): suid = str(base62(int(uuid.UUID(md.uid)))) result.append({ 'suid': suid, 'uid': md.uid, 'title': md.title, 'description': md.description, 'repository': md.repository, 'revisions': list(), }) rev_query = Term('suid', suid) & Term('visibility', 'anonymous') fl = revision_info_fl for rev_md in Metadata(config, SOLR_FIELDS).query(q=rev_query, fl=fl): if not chk_publication(rev_md): continue result[-1]['revisions'].append(revision_info(rev_md)) return result
def __call__(self): if hasattr(self, '_todelete'): config = solr_config(self) for revision in self._todelete: unindex_doc(config, revision) del self.model[revision.__name__] del self._todelete self.model() self.metadata()
def index_media(media): body = ' '.join([ media.metadata.get('title', ''), media.metadata.get('description', ''), media.metadata.get('author', ''), ]) index_doc(solr_config(media), media, path='/'.join(nodepath(media)), repository=media.__parent__.metadata.title, type='Media', body=body)
def __call__(self): if not hasattr(self, '_todelete'): return config = solr_config(self) for repository in self._todelete: for media in repository.values(): unindex_doc(config, media) for revision in media.values(): unindex_doc(config, revision) path = os.path.join(self.dbpath, repository.__name__) shutil.rmtree(path) del self._todelete
def info(request): root = get_root() config = solr_config(root) uid = request.matchdict['uid'] query = Term('uid', uid) & Term('visibility', 'anonymous') md = Metadata(config, SOLR_FIELDS) result = md.query(q=query, fl=revision_info_fl) if len(result) != 1: return {} md = result[0] if not chk_publication(md): return {} return revision_info(md)
def access(request): root = get_root() config = solr_config(root) uid = request.matchdict['uid'] query = Term('uid', uid) & Term('visibility', 'anonymous') md = Metadata(config, SOLR_FIELDS) fl = 'effective,expires' result = md.query(q=query, fl=fl) if len(result) != 1: return False md = result[0] if not chk_publication(md): return False return True
def __call__(self): if hasattr(self, '_todelete'): config = solr_config(self) for media in self._todelete: unindex_doc(config, media) for revision in media.values(): unindex_doc(config, revision) path = os.path.join(self.model.__name__, *media.model.mediapath + ['media.info']) os.remove(path) del self.model[media.__name__] del self._todelete self.model() self.metadata()
def index_revision(revision): path = '/'.join(nodepath(revision)) physical_path = '/'.join(nodepath(revision.model)) try: size = os.path.getsize('%s.binary' % physical_path) except OSError: size = 0 body = ' '.join([ revision.metadata.get('title', ''), revision.metadata.get('description', ''), revision.metadata.get('author', ''), revision.metadata.get('alttag', ''), ', '.join(revision.metadata.get('keywords', [])), ]) mimetype = revision.metadata.get('mimetype', '') index_doc(solr_config(revision), revision, type='Revision', mimetype=mimetype, revision=revision.model.__name__, path=path, physical_path=physical_path, size=size, body=body)