def newsearch(request): newsearch_fields = [] preselected_fields = [] search_config = Config.get_or_create("search") for _id, item in search_config.values.iteritems(): for field in item['fields']: if field.get('advanced', False): nsf_entry = (field['field'], field['name'], item['type'], field.get('type', 'string')) newsearch_fields.append(nsf_entry) if field.get('advdef', False): preselected_fields.append((nsf_entry, '', 'AND')) newsearch_fields.append(("_ft", "Fulltext (greenstone)", "_ft", "_ft")) settings = Config.get_or_create("search_settings") default_type = settings.values.get('default_type', '').lower() newsearch_fields_dict = dict([(x[0], x) for x in newsearch_fields]) context = { "user": request.user, "in_search": True, "fields_select_options": newsearch_fields, "selected_type": default_type } if request.method == "POST": context['postdata'] = request.POST context['selected_type'] = request.POST.get('item_type', default_type).lower() context['fields_select'] = request.POST.getlist('fields_select') context['fields_select'].sort( key=lambda x: request.POST.get("order_%s" % x, VERY_BIG_NUMBER)) def get_post_value(field): if newsearch_fields_dict.get(field, [None])[-1] == 'date': return [ request.POST.get(field + x, '') for x in ("_from", "_to") ] else: return request.POST.get(field, '') context['selected_fields'] = \ [(newsearch_fields_dict.get(field, [None] * 4), get_post_value(field), request.POST.get("operator_%s" % field, 'AND')) for field in context['fields_select'] if field in newsearch_fields_dict] context['raw_query'] = make_advanced_query(request, newsearch_fields) if not context.get('selected_fields', []): context['selected_fields'] = preselected_fields context['fields_select'] = [x[0][0] for x in preselected_fields] context['item_types'] = ['revista', 'libro'] return render_to_response('search/newsearch.html', context)
def newsearch(request): newsearch_fields = [] preselected_fields = [] search_config = Config.get_or_create("search") for _id, item in search_config.values.iteritems(): for field in item['fields']: if field.get('advanced', False): nsf_entry = (field['field'], field['name'], item['type'], field.get('type', 'string')) newsearch_fields.append(nsf_entry) if field.get('advdef', False): preselected_fields.append((nsf_entry, '', 'AND')) newsearch_fields.append(("_ft", "Fulltext (greenstone)", "_ft", "_ft")) settings = Config.get_or_create("search_settings") default_type = settings.values.get('default_type', '').lower() newsearch_fields_dict = dict([(x[0], x) for x in newsearch_fields]) context = {"user": request.user, "in_search": True, "fields_select_options": newsearch_fields, "selected_type": default_type} if request.method == "POST": context['postdata'] = request.POST context['selected_type'] = request.POST.get('item_type', default_type).lower() context['fields_select'] = request.POST.getlist('fields_select') context['fields_select'].sort(key=lambda x: request.POST.get( "order_%s" % x, VERY_BIG_NUMBER)) def get_post_value(field): if newsearch_fields_dict.get(field, [None])[-1] == 'date': return [request.POST.get(field + x, '') for x in ("_from", "_to")] else: return request.POST.get(field, '') context['selected_fields'] = \ [(newsearch_fields_dict.get(field, [None] * 4), get_post_value(field), request.POST.get("operator_%s" % field, 'AND')) for field in context['fields_select'] if field in newsearch_fields_dict] context['raw_query'] = make_advanced_query(request, newsearch_fields) if not context.get('selected_fields', []): context['selected_fields'] = preselected_fields context['fields_select'] = [x[0][0] for x in preselected_fields] context['item_types'] = ['revista', 'libro'] return render_to_response('search/newsearch.html', context)
def get_fields(request): """ Returns a json with selected fields in config """ search_config = Config.get_or_create("search") items = {} for _id, item in search_config.values.iteritems(): items[_id] = item['fields'] for field in item['fields']: field['field'] = "#index#_" + field['field'] if not field['filter']: del(field['filter']) if not field['show']: del(field['show']) if 'more' in field and not field['more']: del(field['more']) if 'advanced' in field and not field['advanced']: del(field['advanced']) if 'advdef' in field and not field['advdef']: del(field['advdef']) if 'exist' in field and not field['exist']: del(field['exist']) return HttpResponse(simplejson.dumps(items), mimetype='application/javascript')
def query(request): host = request.user.tematres_host if not host: tematres_conf = Config.get_or_create("tematres") host = tematres_conf["values"].get("hosts", [None])[0] result = [] if host: service = pythree.Service(host) if service.info().status == "available": query = request.GET.get("term") similar = service.similar(query) terms = service.search(query) result.append({'category': 'similar', 'label': similar}) i = 0 for term in terms: termdict = {'category': 'terms', 'label': term.string} i += 1 if i < 5: try: termdict['desc'] = term.notes[0].text except IndexError: pass result.append(termdict) return HttpResponse(simplejson.dumps(result),\ mimetype='application/javascript')
def get_fields(request): """ Returns a json with selected fields in config """ search_config = Config.get_or_create("search") items = {} for _id, item in search_config.values.iteritems(): items[_id] = item['fields'] for field in item['fields']: field['field'] = "#index#_" + field['field'] if not field['filter']: del (field['filter']) if not field['show']: del (field['show']) if 'more' in field and not field['more']: del (field['more']) if 'advanced' in field and not field['advanced']: del (field['advanced']) if 'advdef' in field and not field['advdef']: del (field['advdef']) if 'exist' in field and not field['exist']: del (field['exist']) return HttpResponse(simplejson.dumps(items), mimetype='application/javascript')
def greenstone_edit(request): from gplib.apps.couchflow.models import Config import os.path if request.method == "POST": conf = Config.get_or_create("greenstone") for key in ['host', 'upload_path', 'template']: old_val = conf.values.get(key, '') conf.values[key] = request.POST.get(key, old_val) context = {} if not os.path.isdir(conf.values["upload_path"]): context['error'] = "Invalid upload path" elif not os.access(conf.values["upload_path"], os.W_OK): context['error'] = "Can't write to upload path" elif conf.values["template"].startswith("/"): context['error'] = "Template can't start with /" elif not conf.values["template"].endswith(".pdf"): context['error'] = "Template must include .pdf extension" if 'error' not in context: conf.save() return greenstone(request, context)
def edit_or_create_user(request, user_id=None, form=None, user=None): if (((user_id and user_id != request.user.username) or not user_id) and not request.user.is_superuser): context = {'error': 'No autorizado'} return render_to_response('error.html', context, context_instance=RequestContext(request)) if user is None: if user_id: user = User.view("couchauth/username", key=user_id).one() if not user: return HttpResponseRedirect('/webconf/couchauth/show_users/') else: user = User() user.password = '' if form is None: form = UserForm(instance=user) if not request.user.is_superuser: del form.fields['is_staff'] del form.fields['is_active'] del form.fields['is_superuser'] # Moved out of the main form layout on the template del form.fields['photo'] tematres_conf = Config.get_or_create("tematres") hosts = tematres_conf["values"].get("hosts", []) form.fields['tematres_host'].widget.choices = map(None, hosts, hosts) form_url = "/webconf/couchauth/save_user/%s" % (user_id or '') if user_id: delete_url = "/webconf/couchauth/delete_user/%s" % (user._id) form_title = "Editando usuario: " + user.username else: delete_url = None form_title = "Creando usuario" groups = Group.view("couchauth/all_groups") if user._attachments and 'photo' in user._attachments: photo = "/couchflow/get_attach/couchauth/%s/photo" % (user._id) else: photo = None context = { 'form': form, 'userdoc': user, 'form_title': form_title, 'form_url': form_url, 'delete_url': delete_url, 'groups': groups, 'photo': photo, } return render_to_response('webconf/couchauth/form_user.html', context, context_instance=RequestContext(request))
def admin(request): user = request.user context = {"user": user} wf_items = list(WFItem.view("couchflow/items", include_docs=True)) save_config(request, wf_items) settings = Config.get_or_create("search_settings") default_type = settings.values.get('default_type', '') if request.method == "POST": post_default_type = request.POST.get('default_type', '') if post_default_type != default_type: settings.values['default_type'] = post_default_type.lower() settings.save() default_type = post_default_type items = [] for item in wf_items: fields = {} for _id, ifields in item.fields_properties.iteritems(): # Just marc fields if int(ifields['id']) > 1000: continue field_name = ifields['id'] if ifields['list'][0].subfields: default_field = { 'id': ifields['id'], 'name': ifields['field_name'], 'subfields': {} } subfields = fields.setdefault(field_name, default_field)["subfields"] for subfield in ifields['list'][0].subfields.values(): sfield_name = '%s_%s' % (ifields['id'], subfield.field_name) sfield = subfields.setdefault(sfield_name, {}) sfield['name'] = subfield.field_name fields[field_name]['subfields'] = sorted(subfields.items()) else: fields.setdefault(field_name, {})['id'] = field_name fields[field_name]['name'] = ifields.field_name items.append((item.name, item._id, sorted(fields.items()))) context['items'] = items context['default_type'] = default_type.lower() return render_to_response('search/admin.html', context)
def greenstone(request, context=None): from gplib.apps.couchflow.models import Config conf = Config.get_or_create("greenstone") if not context: context = {} context['conf'] = conf.values return render_to_response('webconf/greenstone.html', context, context_instance=RequestContext(request))
def admin(request): user = request.user context = {"user": user} wf_items = list(WFItem.view("couchflow/items", include_docs=True)) save_config(request, wf_items) settings = Config.get_or_create("search_settings") default_type = settings.values.get('default_type', '') if request.method == "POST": post_default_type = request.POST.get('default_type', '') if post_default_type != default_type: settings.values['default_type'] = post_default_type.lower() settings.save() default_type = post_default_type items = [] for item in wf_items: fields = {} for _id, ifields in item.fields_properties.iteritems(): # Just marc fields if int(ifields['id']) > 1000: continue field_name = ifields['id'] if ifields['list'][0].subfields: default_field = {'id': ifields['id'], 'name': ifields['field_name'], 'subfields': {}} subfields = fields.setdefault(field_name, default_field)["subfields"] for subfield in ifields['list'][0].subfields.values(): sfield_name = '%s_%s' % (ifields['id'], subfield.field_name) sfield = subfields.setdefault(sfield_name, {}) sfield['name'] = subfield.field_name fields[field_name]['subfields'] = sorted(subfields.items()) else: fields.setdefault(field_name ,{})['id'] = field_name fields[field_name]['name'] = ifields.field_name items.append((item.name, item._id, sorted(fields.items()))) context['items'] = items context['default_type'] = default_type.lower() return render_to_response('search/admin.html', context)
def greenstone_test(request): from gplib.apps.couchflow.models import Config from gplib.apps.search.utils import greenstone_query if request.method == "POST": conf = Config.get_or_create("greenstone") collection = request.POST.get("collection", "") query = request.POST.get("query", "") context = {} context['results'] = greenstone_query(collection, "", query) context['postdata'] = request.POST return greenstone(request, context)
def greenstone_query(collection, lang, string): """Wrapper for the function above that depends on the config db""" conf = Config.get_or_create("greenstone") server_base_url = conf.values.get('host', '') if not server_base_url: return [] else: try: return _greenstone_query(server_base_url, collection, lang, string) except WebFault, e: print "SOAP WebFault", e return [] except URLError, e: print "urlib error", e return []
def save_config(request, wf_items): """ Parse request.POST, get field/subfields items and save config """ search_config = Config.get_or_create("search") if request.method == "POST": for wf_item in wf_items: item_id = wf_item._id item_type = wf_item.item_type item_conf = {'type': item_type, 'fields': []} fields_conf = item_conf['fields'] for field in request.POST.getlist(item_id + "_field"): index, field_id = field.split('_', 1) field_conf = {} f_show = request.POST.get("%s_%s_show" % (item_id, index)) f_filter = request.POST.get("%s_%s_filter" % (item_id, index)) f_more = request.POST.get("%s_%s_more" % (item_id, index)) f_adv = request.POST.get("%s_%s_advanced" % (item_id, index)) f_advdef = request.POST.get("%s_%s_advdef" % (item_id, index)) f_exist = request.POST.get("%s_%s_exist" % (item_id, index)) f_name = request.POST.get("%s_%s_name" % (item_id, index)) if '_' in field_id: main_id, sub_id = field_id.split('_', 1) type = wf_item.fields_properties[main_id].list[0]\ .subfields[sub_id].type else: type = wf_item.fields_properties[field_id].type field_conf['show'] = f_show == "on" field_conf['filter'] = f_filter == "on" field_conf['more'] = f_more == "on" field_conf['advanced'] = f_adv == "on" field_conf['advdef'] = f_advdef == "on" field_conf['exist'] = f_exist == "on" field_conf['name'] = f_name field_conf['field'] = field_id field_conf['type'] = type fields_conf.append(field_conf) search_config.values[item_id] = item_conf search_config.save()
def handle(self, *args, **options): version = Config.get_or_create("version") db_version = version.values.get('db', 0) if db_version == 0: self.update_0() self.create_edit_workflows() version.values['db'] = 1 version.save() print "Run it again to update to next db version" elif db_version == 1: self.update_1() version.values['db'] = 2 version.save() elif db_version == 2: print 'DB already up to date, db version', db_version else: print 'Invalid Database Version', db_version
def admin(request): user = request.user tematres_conf = Config.get_or_create("tematres") hosts = tematres_conf["values"].get("hosts", []) query = query_server = None context = {"user": user, "hosts": hosts, "info": None, "terms": []} if request.method == "POST": if 'host' in request.POST: hosts = list(filter(None, request.POST.getlist("host"))) tematres_conf["values"]["hosts"] = hosts tematres_conf.save() context["hosts"] = hosts elif 'query' in request.POST: query = request.POST.get("query") query_server = request.POST.get("query_server") if hosts: infos = [] for host in hosts: service = pythree.Service(host) infos.append((host, service.info())) context["infos"] = infos if query and query_server: service = pythree.Service(query_server) if service.info().status == "available": similar = service.similar(query) terms = service.search(query) context["query"] = query context["query_server"] = query_server context["terms"] = terms context["similar"] = similar else: context["query_error"] = True return render_to_response("tematres/admin.html", context)
def data(request): """ Returns data for datatables """ user = request.user secho = int(request.POST.get('sEcho', 0)) + 1 return_dict = { "aaData": [], "iTotalRecords": 0, "iTotalDisplayRecords": 0, "sEcho": secho } query = None sort = None sort_reverse = False qfilter = '' basic_greenstone = True search_config = Config.get_or_create("search") if 'raw_query' in request.POST: query, sort_raw, query_greenstone = \ request.POST['raw_query'].split("||", 2) if sort_raw: sort = sort_raw[1:] sort_reverse = (sort_raw[0] == '\\') # make_advanced_query() doesn't handle greenstone filtering. # Instead, it leaves a placeholder that is replaced here. # This is to leave all the querying to the second request # (this one), and only lucene query building to the first. query = query.replace( GREENSTONE_NEWSEARCH_PLACEHOLDER, "(%s)" % (' OR '.join([ "urn:%s" % x['nodeID'] for x in greenstone_query("", "", query_greenstone) ]))) basic_greenstone = False elif 'filter' in request.POST: qfilter = sanitize_lucene(request.POST['filter']) qfilter = request.POST['filter'] reference = request.POST.get('reference', 0) filter_item_type = request.POST.get('item_type', None) query = make_query(search_config, qfilter, reference, filter_item_type) elif 'filtered' in request.POST: qfilter = sanitize_lucene(request.POST['filtered']) reference = request.POST.get('reference', 0) filter_item_type = request.POST.get('item_type', None) query = make_query(search_config, qfilter, reference, filter_item_type) if not query: print "search failed: query = %s" % query return HttpResponse(simplejson.dumps(return_dict),\ mimetype='application/javascript') show_config = {} # Result Display Configuration for item in search_config.values.values(): item_type = item['type'] fields = OrderedDict() for field in item['fields']: if field['show']: more = field.get('more', False) existence = field.get('exist', False) fields[field['field']] = (field['name'], more, existence) show_config[item_type] = fields try: docs = search('search/by_field', q=query, include_fields="022_a,020_a,urn,_id,existence", limit=133742) docs = list(docs) except RequestFailed: print "search failed: request failed" return HttpResponse(simplejson.dumps(return_dict),\ mimetype='application/javascript') db = get_db('couchflow') # group uniq docs by urn uniq_docs = {} if basic_greenstone: greenstone_urns = [ x['nodeID'] for x in greenstone_query("", "", qfilter) ] greenstone_docs = db.view("couchflow/by_urn", keys=greenstone_urns) for doc in greenstone_docs: urn = doc['key'] uniq_docs.setdefault(urn, { 'count': 0, 'id': None, "existences": [] }) uniq_docs[urn]['id'] = doc['id'] #uniq_docs[urn]['count'] += 1 uniq_docs[urn]['greenstone'] = True for doc in docs: try: urn = doc['fields']['urn'] except KeyError: urn = None if urn is None or urn == 'undefined': print "Item should have urn", doc['id'] continue # TODO: check if should be a list if type(urn) is list: urn = urn[0] uniq_docs.setdefault(urn, {'count': 0, 'id': None, "existences": []}) if doc['fields']['existence'] != "false": uniq_docs[urn]['existences'].append(doc['id']) uniq_docs[urn]['count'] += 1 else: uniq_docs[urn]['id'] = doc['id'] columns = [] start = int(request.POST['iDisplayStart']) length = int(request.POST['iDisplayLength']) #sort_col = int(request.POST['iSortCol_0']) #sort_dir = request.POST['sSortDir_0'] count = len([u for u in uniq_docs.values() if u["id"]]) sorted_uniq_docs = uniq_docs.values() if basic_greenstone: sorted_uniq_docs.sort(key=lambda x: 'greenstone' not in x) keys = [doc['id'] for doc in sorted_uniq_docs[start:start + length]] keys_exist = [doc['existences']\ for doc in sorted_uniq_docs[start:start+length]] keys_exist = [item for sublist in keys_exist for item in sublist] def _get_field(field, doc): subfield = "" if '_' in field: field, subfield = field.split('_') #field_value = doc.fields_properties.get(field, None) try: field_value = doc["fields_properties"][field] except KeyError: field_value = "" if field_value and len(field_value['list']): field_value = field_value['list'][0] if subfield: field_value = field_value['subfields'].get(subfield, "") if field_value and 'exec_value' in field_value and field_value[ 'exec_value']: exec_val = field_value['exec_value'][0] if not isinstance(exec_val, basestring): if exec_val == None: exec_val = "" exec_val = str(exec_val) return exec_val return "" # get existences existences = {} for doc in db.view('_all_docs', keys=keys_exist, include_docs=True): existences[doc["doc"]["_id"]] = doc["doc"] for doc in db.view('_all_docs', keys=keys, include_docs=True): #doc = WFItem.wrap(doc['doc']) if not "doc" in doc: continue doc = doc["doc"] show_item_config = show_config.get(doc['item_type'], None) if not show_item_config: print 'Search config missing for', doc['item_type'] continue try: img_name = doc['fields_properties']['5000']['list'][0][ 'exec_value'][0] except Exception, error: print 'Image not found', error img_name = 'none.png' img_path = "/couchflow/get_attach/couchflow/%s/%s" % (doc['_id'], img_name) row = [doc['_id'], '<img style="width:80px" src="%s"/>' % img_path] data = '' for field, (name, more, existence) in show_item_config.iteritems(): if existence: continue field_value = _get_field(field, doc) if not field_value: continue row_value = '%s: %s' % (name, field_value) row_value = row_value.replace('/', '').replace(',', '') more_class = ' class="search_more"' if more else '' data += '<div%s>%s</div>' % (more_class, row_value) doc_urn = get_urn(doc) if not doc_urn: print "Invalid Item, need a urn", doc["_id"] continue if not doc['reference']: data += 'Disponibles: %s<br>' % uniq_docs[doc_urn]['count'] if uniq_docs[doc_urn]["existences"]: data += "<br><h3 class='search_more'>Ejemplares</h3>" # Add Existences for e in uniq_docs[doc_urn]["existences"]: if existences.get(e, False): data += "<div id='%s' class='existence search_more'>" % e for field, (name, more, exist_conf) in\ show_item_config.iteritems(): if exist_conf: field_value = _get_field(field, existences[e]) if not field_value: field_value = "" row_value = '%s: %s' % (name, field_value) row_value = row_value.replace('/', '').replace(',', '') more_class = ' class="search_more"' if more else '' data += '<div%s>%s</div>' % (more_class, row_value) data += "</div>" row.append(data) row.append('') sort_value = None if sort: sort_value = _get_field(sort, doc) columns.append((sort_value, row))
def data(request): """ Returns data for datatables """ user = request.user secho = int(request.POST.get('sEcho', 0)) + 1 return_dict = {"aaData": [], "iTotalRecords":0, "iTotalDisplayRecords":0, "sEcho": secho} query = None sort = None sort_reverse = False qfilter = '' basic_greenstone = True search_config = Config.get_or_create("search") if 'raw_query' in request.POST: query, sort_raw, query_greenstone = \ request.POST['raw_query'].split("||", 2) if sort_raw: sort = sort_raw[1:] sort_reverse = (sort_raw[0] == '\\') # make_advanced_query() doesn't handle greenstone filtering. # Instead, it leaves a placeholder that is replaced here. # This is to leave all the querying to the second request # (this one), and only lucene query building to the first. query = query.replace(GREENSTONE_NEWSEARCH_PLACEHOLDER, "(%s)" % (' OR '.join(["urn:%s" % x['nodeID'] for x in greenstone_query("", "", query_greenstone)]))) basic_greenstone = False elif 'filter' in request.POST: qfilter = sanitize_lucene(request.POST['filter']) qfilter = request.POST['filter'] reference = request.POST.get('reference', 0) filter_item_type = request.POST.get('item_type', None) query = make_query(search_config, qfilter, reference, filter_item_type) elif 'filtered' in request.POST: qfilter = sanitize_lucene(request.POST['filtered']) reference = request.POST.get('reference', 0) filter_item_type = request.POST.get('item_type', None) query = make_query(search_config, qfilter, reference, filter_item_type) if not query: print "search failed: query = %s" % query return HttpResponse(simplejson.dumps(return_dict),\ mimetype='application/javascript') show_config = {} # Result Display Configuration for item in search_config.values.values(): item_type = item['type'] fields = OrderedDict() for field in item['fields']: if field['show']: more = field.get('more', False) existence = field.get('exist', False) fields[field['field']] = (field['name'], more, existence) show_config[item_type] = fields try: docs = search('search/by_field', q=query, include_fields="022_a,020_a,urn,_id,existence", limit=133742) docs = list(docs) except RequestFailed: print "search failed: request failed" return HttpResponse(simplejson.dumps(return_dict),\ mimetype='application/javascript') db = get_db('couchflow') # group uniq docs by urn uniq_docs = {} if basic_greenstone: greenstone_urns = [x['nodeID'] for x in greenstone_query("", "", qfilter)] greenstone_docs = db.view("couchflow/by_urn", keys=greenstone_urns) for doc in greenstone_docs: urn = doc['key'] uniq_docs.setdefault(urn, {'count':0, 'id': None, "existences": []}) uniq_docs[urn]['id'] = doc['id'] #uniq_docs[urn]['count'] += 1 uniq_docs[urn]['greenstone'] = True for doc in docs: try: urn = doc['fields']['urn'] except KeyError: urn = None if urn is None or urn == 'undefined': print "Item should have urn", doc['id'] continue # TODO: check if should be a list if type(urn) is list: urn = urn[0] uniq_docs.setdefault(urn, {'count':0, 'id': None, "existences": []}) if doc['fields']['existence'] != "false": uniq_docs[urn]['existences'].append(doc['id']) uniq_docs[urn]['count'] += 1 else: uniq_docs[urn]['id'] = doc['id'] columns = [] start = int(request.POST['iDisplayStart']) length = int(request.POST['iDisplayLength']) #sort_col = int(request.POST['iSortCol_0']) #sort_dir = request.POST['sSortDir_0'] count = len([u for u in uniq_docs.values() if u["id"]]) sorted_uniq_docs = uniq_docs.values() if basic_greenstone: sorted_uniq_docs.sort(key=lambda x: 'greenstone' not in x) keys = [doc['id'] for doc in sorted_uniq_docs[start:start+length]] keys_exist = [doc['existences']\ for doc in sorted_uniq_docs[start:start+length]] keys_exist = [item for sublist in keys_exist for item in sublist] def _get_field(field, doc): subfield = "" if '_' in field: field, subfield = field.split('_') #field_value = doc.fields_properties.get(field, None) try: field_value = doc["fields_properties"][field] except KeyError: field_value = "" if field_value and len(field_value['list']): field_value = field_value['list'][0] if subfield: field_value = field_value['subfields'].get(subfield, "") if field_value and 'exec_value' in field_value and field_value['exec_value']: exec_val = field_value['exec_value'][0] if not isinstance(exec_val, basestring): if exec_val == None: exec_val = "" exec_val = str(exec_val) return exec_val return "" # get existences existences = {} for doc in db.view('_all_docs', keys=keys_exist, include_docs=True): existences[doc["doc"]["_id"]] = doc["doc"] for doc in db.view('_all_docs', keys=keys, include_docs=True): #doc = WFItem.wrap(doc['doc']) if not "doc" in doc: continue doc = doc["doc"] show_item_config = show_config.get(doc['item_type'], None) if not show_item_config: print 'Search config missing for', doc['item_type'] continue try: img_name = doc['fields_properties']['5000']['list'][0]['exec_value'][0] except Exception, error: print 'Image not found', error img_name = 'none.png' img_path = "/couchflow/get_attach/couchflow/%s/%s" % (doc['_id'], img_name) row = [doc['_id'], '<img style="width:80px" src="%s"/>' % img_path] data = '' for field, (name, more, existence) in show_item_config.iteritems(): if existence: continue field_value = _get_field(field, doc) if not field_value: continue row_value = '%s: %s' % (name, field_value) row_value = row_value.replace('/', '').replace(',', '') more_class = ' class="search_more"' if more else '' data += '<div%s>%s</div>' % (more_class, row_value) doc_urn = get_urn(doc) if not doc_urn: print "Invalid Item, need a urn", doc["_id"] continue if not doc['reference']: data += 'Disponibles: %s<br>' % uniq_docs[doc_urn]['count'] if uniq_docs[doc_urn]["existences"]: data += "<br><h3 class='search_more'>Ejemplares</h3>" # Add Existences for e in uniq_docs[doc_urn]["existences"]: if existences.get(e, False): data += "<div id='%s' class='existence search_more'>" % e for field, (name, more, exist_conf) in\ show_item_config.iteritems(): if exist_conf: field_value = _get_field(field, existences[e]) if not field_value: field_value = "" row_value = '%s: %s' % (name, field_value) row_value = row_value.replace('/', '').replace(',', '') more_class = ' class="search_more"' if more else '' data += '<div%s>%s</div>' % (more_class, row_value) data += "</div>" row.append(data) row.append('') sort_value = None if sort: sort_value = _get_field(sort, doc) columns.append((sort_value, row))
def reference_complete(request): """ Returns data for reference complete """ query = request.GET.get("term") qfilter = sanitize_lucene(query) search_config = Config.get_or_create("search") # autoridades query = make_query(search_config, qfilter, True, "05a721a33096563ec44d8da885fa1a30") show_config = {} result = [] # Result Display Configuration for item in search_config.values.values(): item_type = item['type'] fields = OrderedDict() for field in item['fields']: if field['show']: more = field.get('more', False) fields[field['field']] = (field['name'], more) show_config[item_type] = fields try: docs = search('search/by_field', q=query, include_fields="022_a,020_a,urn,_id", limit=133742) docs = list(docs) except RequestFailed: print "Fail!" print "QQ", query # group uniq docs by urn uniq_docs = {} for doc in docs: try: urn = doc['fields']['urn'] except KeyError: print "Item should have urn" continue # TODO: check if should be a list if type(urn) is list: urn = urn[0] uniq_docs.setdefault(urn, {'count':0, 'id': None}) uniq_docs[urn]['id'] = doc['id'] uniq_docs[urn]['count'] += 1 db = get_db('couchflow') keys = [doc['id'] for doc in uniq_docs.values()] def _get_field(field, doc): subfield = "" if '_' in field: field, subfield = field.split('_') #field_value = doc.fields_properties.get(field, None) try: field_value = doc["fields_properties"][field] except KeyError: field_value = "" if field_value and len(field_value['list']): field_value = field_value['list'][0] if subfield: field_value = field_value['subfields'].get(subfield, "") if field_value and 'exec_value' in field_value and field_value['exec_value']: exec_val = field_value['exec_value'][0] if not isinstance(exec_val, basestring): if exec_val == None: exec_val = "" exec_val = str(exec_val) return exec_val return "" for doc in db.view('_all_docs', keys=keys, include_docs=True): #doc = WFItem.wrap(doc['doc']) doc = doc["doc"] show_item_config = show_config.get(doc['item_type'], None) if not show_item_config: print 'Unknown', doc['item_type'] continue field = _get_field('700_a', doc) result.append({'label': field}) #data = '' #for field, (name, more) in show_item_config.iteritems(): # row_value = '%s: %s' % (name, _get_field(field, doc)) # row_value = row_value.replace('/', '').replace(',', '') # data += '<div>%s</div>' % row_value #doc_urn = get_urn(doc) #if not doc_urn: # print "Invalid Item, need a urn", doc["_id"] # continue #result.append(data) return HttpResponse(simplejson.dumps(result),\ mimetype='application/javascript')
def reference_complete(request): """ Returns data for reference complete """ query = request.GET.get("term") qfilter = sanitize_lucene(query) search_config = Config.get_or_create("search") # autoridades query = make_query(search_config, qfilter, True, "05a721a33096563ec44d8da885fa1a30") show_config = {} result = [] # Result Display Configuration for item in search_config.values.values(): item_type = item['type'] fields = OrderedDict() for field in item['fields']: if field['show']: more = field.get('more', False) fields[field['field']] = (field['name'], more) show_config[item_type] = fields try: docs = search('search/by_field', q=query, include_fields="022_a,020_a,urn,_id", limit=133742) docs = list(docs) except RequestFailed: print "Fail!" print "QQ", query # group uniq docs by urn uniq_docs = {} for doc in docs: try: urn = doc['fields']['urn'] except KeyError: print "Item should have urn" continue # TODO: check if should be a list if type(urn) is list: urn = urn[0] uniq_docs.setdefault(urn, {'count': 0, 'id': None}) uniq_docs[urn]['id'] = doc['id'] uniq_docs[urn]['count'] += 1 db = get_db('couchflow') keys = [doc['id'] for doc in uniq_docs.values()] def _get_field(field, doc): subfield = "" if '_' in field: field, subfield = field.split('_') #field_value = doc.fields_properties.get(field, None) try: field_value = doc["fields_properties"][field] except KeyError: field_value = "" if field_value and len(field_value['list']): field_value = field_value['list'][0] if subfield: field_value = field_value['subfields'].get(subfield, "") if field_value and 'exec_value' in field_value and field_value[ 'exec_value']: exec_val = field_value['exec_value'][0] if not isinstance(exec_val, basestring): if exec_val == None: exec_val = "" exec_val = str(exec_val) return exec_val return "" for doc in db.view('_all_docs', keys=keys, include_docs=True): #doc = WFItem.wrap(doc['doc']) doc = doc["doc"] show_item_config = show_config.get(doc['item_type'], None) if not show_item_config: print 'Unknown', doc['item_type'] continue field = _get_field('700_a', doc) result.append({'label': field}) #data = '' #for field, (name, more) in show_item_config.iteritems(): # row_value = '%s: %s' % (name, _get_field(field, doc)) # row_value = row_value.replace('/', '').replace(',', '') # data += '<div>%s</div>' % row_value #doc_urn = get_urn(doc) #if not doc_urn: # print "Invalid Item, need a urn", doc["_id"] # continue #result.append(data) return HttpResponse(simplejson.dumps(result),\ mimetype='application/javascript')