Exemplo n.º 1
0
def import_items(request):
    raw = request.POST.getlist('item')
    items = []
    o={}
    o['imported_docs'] = []
    o['existing_docs'] = []
    for item in raw:
        items.append(json.loads(item,strict=False))
    for doc_import in items:
        if not ZoteroLink.objects.filter(zotero_url=doc_import['url']):
            d = Document(creator=request.user, last_updater=request.user, description=doc_import['csl'])
            d.save()
            o['imported_docs'].append(d)
            link = ZoteroLink(zotero_data=json.dumps(doc_import['json']), zotero_url=doc_import['url'], doc_id=d.id)
            try:
                doc_import['date']['year']
                link.date_information = json.dumps(doc_import['date'])
            except KeyError:
                pass
            link.save()
        else:
            existing_link = ZoteroLink.objects.filter(zotero_url=doc_import['url'])[0]
            o['existing_docs'].append(existing_link.doc)
        if doc_import['related_object'] == 'topic':
            related_topic = Topic.objects.get(id=int(doc_import['related_id']))
            if TopicAssignment.objects.filter(document=d, topic=related_topic):
                pass
            else:
                new_assignment = TopicAssignment.objects.create(content_object=d, topic=related_topic, creator=request.user)
                new_assignment.save()
    return render_to_response(
        'success.html', o, context_instance=RequestContext(request))
Exemplo n.º 2
0
def import_items(request):
    if request.session.get('import_complete', False):
        return HttpResponse('Please only submit items once')
    item_data = request.POST.getlist('data')
    item_citations = request.POST.getlist('changed-citation')
    user = request.user
    o={}
    o['created_items'] = []
    item_counter = 0
    for item_data_string, updated_citation in zip(item_data, item_citations):
        item_counter += 1
        action = request.POST.get('import-action-%s' % item_counter)
        if action not in ['create', 'update']:
            continue
        item_data = json.loads(item_data_string, object_pairs_hook=OrderedDict)
        if updated_citation:
            citation = updated_citation
        else:
            citation = item_data['citation']
        if action == "create":
            d = Document(creator=user, last_updater=user, description=citation)
            d.save()
        elif action == "update":
            update_id = request.POST.get('item-update-%s' % item_counter)
            d = Document.objects.get(id=update_id)
            d.last_updated = datetime.datetime.now()
            d.last_updater = user
            d.save()
            if d.zotero_link():
                d.zotero_link().delete()
        link = ZoteroLink(zotero_data=item_data['json'], zotero_url=item_data['url'], doc_id=d.id)
        try:
            item_data['date']['year']
            link.date_information = json.dumps(item_data['date'])
        except KeyError:
            pass
        link.save()
        reltopic = request.GET.get('reltopic', False)
        if reltopic:
            related_topic = Topic.objects.get(id=int(reltopic))
            new_assignment = TopicAssignment.objects.create(
                content_object=d,
                topic=related_topic,
                creator=user
                )
            new_assignment.save()
        o['created_items'].append(d)
    request.session['import_complete'] = True
    redirect_url = request.GET.get('return_to', '/')
    return HttpResponseRedirect(redirect_url)
    def forwards(self, orm):
        "Write your forwards methods here."
        # Note: Remember to use orm['appname.ModelName'] rather than "from appname.models..."
        digest_update_query = """
        UPDATE main_document
        SET description_digest = %s
        WHERE id = %s
        """
        for document in orm['main.Document'].objects.all():
            db.execute(digest_update_query,
                       params=[Document.hash_description(document.description),
                               document.id])

        duplicates_query = """
        SELECT project_id, description_digest, COUNT(description_digest) as occurences
        FROM main_document
        GROUP BY project_id, description_digest
        HAVING COUNT(description_digest) > 1;
        """

        duplicates = db.execute(duplicates_query);
        for project_id, description_digest, ct in duplicates:
            qs = orm['main.Document'].objects.filter(project_id=project_id,
                                                     description_digest=description_digest)
            for i, document in enumerate(qs[1:], 2):
                description = document.description
                last_el = (list(description.iterdescendants()) or [description])[-1]
                appended_text = u' ({})'.format(i)
                if last_el.tail:
                    last_el.tail += appended_text
                else:
                    last_el.text += appended_text
                update_query = """
                UPDATE main_document
                SET description = %s, description_digest = %s
                WHERE id = %s
                """
                db.execute(update_query, params=[etree.tostring(description),
                                                 Document.hash_description(description),
                                                 document.id])
        remaining_duplicates = db.execute(duplicates_query)
        assert not len(remaining_duplicates), "Still duplicates"
Exemplo n.º 4
0
    def __call__(self, attrs):
        if self.instance is not None:
            description = attrs.get('description', self.instance.description)
        else:
            description = attrs['description']

        project = attrs['project']
        qs = Document.objects.filter(
            description_digest=Document.hash_description(description),
            project=project)
        if self.instance is not None:
            qs = qs.exclude(id=self.instance.id)
        if qs.exists():
            raise serializers.ValidationError({'description': [self.message]})
Exemplo n.º 5
0
    def __call__(self, attrs):
        if self.instance is not None:
            description = attrs.get('description', self.instance.description)
        else:
            description = attrs['description']

        project = attrs['project']
        qs = Document.objects.filter(
            description_digest=Document.hash_description(description),
            project=project)
        if self.instance is not None:
            qs = qs.exclude(id=self.instance.id)
        if qs.exists():
            raise serializers.ValidationError({
                'description': [self.message]
            })
Exemplo n.º 6
0
 def validate_description(self, value):
     description_stripped = Document.strip_description(value)
     if not description_stripped:
         raise serializers.ValidationError('Field required.')
     remove_stray_brs(value)
     return value
Exemplo n.º 7
0
def import_from_jigsaw_root(root, user, project):
    order = 1
    for node in root:
        id = node.findtext("docID")
        text = node.findtext("docText")
        #text.tag = 'div'
        docs = list(Document.objects.filter(import_id=id))
        if len(docs)==0:
            d = Document(creator=user, last_updater=user, import_id=id, description=id, ordering=order, project=project)
            d.save()
            t = Transcript(creator=user, last_updater=user, document=d, content=text)
            t.save()
        else:
            d = docs[0]
            d.last_updater = user
            d.description = id
            d.order = order
        d.language = gl.guessLanguageName(text)
        order += 1
        d.save()

        date = node.find("docDate")
        if date is not None and date.text:
            try:
#                pdb.set_trace()
                dt = datetime.strptime(date.text, "%m/%d/%Y")
                res = list(Topic.objects.filter(date=dt))
                cnt = len(res)
                if cnt==0:
                    normalized = "Date: %d/%d/%d" % (dt.year, dt.month, dt.day)
                    t=get_or_create_topic(user, normalized, 'EVT', project, dt)
                    t.date = dt
                    #t=Topic(creator=user, last_updater=user, preferred_name=normalized, date=dt, type='EVT',project=project)
                    t.save()
                else:
                    t=res[0]
                d.related_topics.create(creator=user, topic=t)
            except ValueError as e:
                pass
        for p in node.findall("concept"):
            name=p.text
            t=get_or_create_topic(user, name, 'TAG',project)
            if t:
        	d.related_topics.create(creator=user, topic=t)
            else:
                print "Cannot create topic(%s,type=%s)" % (t,'TAG')
            
        for p in node.findall("person"):
            name=p.text
            t=get_or_create_topic(user, name, 'PER',project)
            if t:
                d.related_topics.create(creator=user, topic=t)
            else:
                print "Cannot create topic(%s,type=%s)" % (t,'PER')
        for p in node.findall("location"):
            name=p.text
            t=get_or_create_topic(user, name, 'PLA',project)
            if t:
                d.related_topics.create(creator=user, topic=t)
            else:
                print "Cannot create topic(%s,type=%s)" % (t,'PLA')
Exemplo n.º 8
0
 def validate_description(self, value):
     description_stripped = Document.strip_description(value)
     if not description_stripped:
         raise serializers.ValidationError('Field required.')
     remove_stray_brs(value)
     return value