[gpapers] 4 new revisions pushed by marcelCo...@gmail.com on 2012-02-16 22:38 GMT

5 views
Skip to first unread message

codesite...@google.com

unread,
Feb 16, 2012, 5:39:18 PM2/16/12
to gpapers...@googlegroups.com
4 new revisions:

Revision: a7b2facc5644
Author: Marcel Stimberg <marcel...@gmail.com>
Date: Wed Feb 15 15:31:06 2012
Log: make playlists work (again)
http://code.google.com/p/gpapers/source/detail?r=a7b2facc5644

Revision: b224b8c5d9ee
Author: Marcel Stimberg <marcel...@gmail.com>
Date: Wed Feb 15 15:37:49 2012
Log: Remove preferences (for now)
http://code.google.com/p/gpapers/source/detail?r=b224b8c5d9ee

Revision: 352731ac9522
Author: Marcel Stimberg <marcel...@gmail.com>
Date: Thu Feb 16 14:37:40 2012
Log: whitespace changes
http://code.google.com/p/gpapers/source/detail?r=352731ac9522

Revision: 921d9a218b2e
Author: Marcel Stimberg <marcel...@gmail.com>
Date: Thu Feb 16 14:38:19 2012
Log: Rearrange menu items, refactor and simplify import code a bit
http://code.google.com/p/gpapers/source/detail?r=921d9a218b2e

==============================================================================
Revision: a7b2facc5644
Author: Marcel Stimberg <marcel...@gmail.com>
Date: Wed Feb 15 15:31:06 2012
Log: make playlists work (again)
http://code.google.com/p/gpapers/source/detail?r=a7b2facc5644

Modified:
/gPapers.py

=======================================
--- /gPapers.py Sun Feb 12 12:44:15 2012
+++ /gPapers.py Wed Feb 15 15:31:06 2012
@@ -76,7 +76,7 @@
import importer
from importer import pango_escape
from importer import html_strip, pango_escape, get_md5_hexdigest_from_data
-from importer import pubmed, google_scholar
+from importer import pubmed, google_scholar, jstor

NOTE_ICON =
gtk.gdk.pixbuf_new_from_file(os.path.join(RUN_FROM_DIR, 'icons', 'note.png'))
BOOKMARK_ICON =
gtk.gdk.pixbuf_new_from_file(os.path.join(RUN_FROM_DIR, 'icons', 'bookmark.png'))
@@ -420,6 +420,7 @@
self.refresh_left_pane()
self.pubmed_search = pubmed.PubMedSearch()
self.google_scholar_search = google_scholar.GoogleScholarSearch()
+ self.jstor_search = jstor.JSTORSearch()
main_window.show()

def init_busy_notifier(self):
@@ -839,24 +840,32 @@
self.left_pane_model.append(self.left_pane_model.get_iter((0),),
('<i>never read</i>',
gtk.gdk.pixbuf_new_from_file(os.path.join(RUN_FROM_DIR, 'icons', 'applications-development.png')),
-5, False))
self.left_pane_model.append(self.left_pane_model.get_iter((0),),
('<i>highest rated</i>',
gtk.gdk.pixbuf_new_from_file(os.path.join(RUN_FROM_DIR, 'icons', 'emblem-favorite.png')),
-4, False))

- self.left_pane_model.append(None, ('<b>External search</b>',
left_pane.render_icon(gtk.STOCK_NETWORK, gtk.ICON_SIZE_MENU), -1, False))
- self.left_pane_model.append(self.left_pane_model.get_iter((1),),
- ('PubMed',
+ self.left_pane_model.append(None, ('PubMed',

gtk.gdk.pixbuf_new_from_file(os.path.join(RUN_FROM_DIR, 'icons', 'favicon_pubmed.ico')),
-1, False))
- for playlist in Playlist.objects.filter(parent='3'):
+ for playlist in Playlist.objects.filter(parent='1'):
if playlist.search_text:
icon = left_pane.render_icon(gtk.STOCK_FIND,
gtk.ICON_SIZE_MENU)
else:
icon = left_pane.render_icon(gtk.STOCK_DND_MULTIPLE,
gtk.ICON_SIZE_MENU)
-
self.left_pane_model.append(self.left_pane_model.get_iter((3),),
(playlist.title, icon, playlist.id, True))
-
- self.left_pane_model.append(self.left_pane_model.get_iter((1),),
- ('Google Scholar',
+
self.left_pane_model.append(self.left_pane_model.get_iter((1),),
(playlist.title, icon, playlist.id, True))
+
+ self.left_pane_model.append(None, ('Google Scholar',

gtk.gdk.pixbuf_new_from_file(os.path.join(RUN_FROM_DIR, 'icons', 'favicon_google.ico')),
-1, False))
-
- self.left_pane_model.append(self.left_pane_model.get_iter((1),),
- ('JSTOR',
+ for playlist in Playlist.objects.filter(parent='2'):
+ if playlist.search_text:
+ icon = left_pane.render_icon(gtk.STOCK_FIND,
gtk.ICON_SIZE_MENU)
+ else:
+ icon = left_pane.render_icon(gtk.STOCK_DND_MULTIPLE,
gtk.ICON_SIZE_MENU)
+
self.left_pane_model.append(self.left_pane_model.get_iter((2),),
(playlist.title, icon, playlist.id, True))
+
+ self.left_pane_model.append(None, ('JSTOR',

gtk.gdk.pixbuf_new_from_file(os.path.join(RUN_FROM_DIR, 'icons', 'favicon_jstor.ico')),
-1, False))
+ for playlist in Playlist.objects.filter(parent='3'):
+ if playlist.search_text:
+ icon = left_pane.render_icon(gtk.STOCK_FIND,
gtk.ICON_SIZE_MENU)
+ else:
+ icon = left_pane.render_icon(gtk.STOCK_DND_MULTIPLE,
gtk.ICON_SIZE_MENU)
+
self.left_pane_model.append(self.left_pane_model.get_iter((3),),
(playlist.title, icon, playlist.id, True))

left_pane.expand_all()
self.ui.get_object('left_pane').get_selection().select_path((0,))
@@ -910,18 +919,16 @@
self.last_middle_pane_search_string = ''
self.ui.get_object('middle_pane_search').set_text('')

+ log_debug('rows[0][0]: %d' % rows[0][0])
if rows[0][0] == 0:
self.current_middle_top_pane_refresh_thread_ident =
thread.start_new_thread(self.refresh_middle_pane_from_my_library, (True,))
- else:
- self.ui.get_object('my_library_filter_pane').hide()
-
- if rows[0][0] == 1: #External search
- if not len(rows[0]) > 1:
- pass # 'External search' title selected FIXME: Should be
forbidden...
- elif rows[0][1] == 0:
- self.current_middle_top_pane_refresh_thread_ident =
thread.start_new_thread(lambda :
self.refresh_middle_pane_from_external(self.pubmed_search), ())
- elif rows[0][1] == 1:
- self.current_middle_top_pane_refresh_thread_ident =
thread.start_new_thread(lambda :
self.refresh_middle_pane_from_external(self.google_scholar_search), ())
+ elif rows[0][0] == 1:
+ self.current_middle_top_pane_refresh_thread_ident =
thread.start_new_thread(lambda :
self.refresh_middle_pane_from_external(self.pubmed_search), ())
+ elif rows[0][0] == 2:
+ self.current_middle_top_pane_refresh_thread_ident =
thread.start_new_thread(lambda :
self.refresh_middle_pane_from_external(self.google_scholar_search), ())
+ elif rows[0][0] == 3:
+ self.current_middle_top_pane_refresh_thread_ident =
thread.start_new_thread(lambda :
self.refresh_middle_pane_from_external(self.jstor_search), ())
+

self.select_middle_top_pane_item(self.ui.get_object('middle_top_pane').get_selection())

def init_middle_top_pane(self):
@@ -1869,6 +1876,7 @@
gtk.gdk.threads_leave()

def refresh_middle_pane_from_external(self, search_provider):
+ log_debug('Starting external search in %s' % search_provider)
search_text =
self.ui.get_object('middle_pane_search').get_text().strip()
if not search_text: return
self.active_threads[ thread.get_ident() ] = 'searching %s...
(%s)' % (search_provider, search_text)

==============================================================================
Revision: b224b8c5d9ee
Author: Marcel Stimberg <marcel...@gmail.com>
Date: Wed Feb 15 15:37:49 2012
Log: Remove preferences (for now)
http://code.google.com/p/gpapers/source/detail?r=b224b8c5d9ee

Modified:
/gPapers.py
/ui.xml

=======================================
--- /gPapers.py Wed Feb 15 15:31:06 2012
+++ /gPapers.py Wed Feb 15 15:37:49 2012
@@ -469,7 +469,6 @@
self.ui.get_object('menuitem_import_doi').connect('activate',
self.import_doi)
self.ui.get_object('menuitem_import_file').connect('activate',
self.import_file)

self.ui.get_object('menuitem_import_directory').connect('activate',
self.import_directory)
- self.ui.get_object('menuitem_preferences').connect('activate',
lambda x: PreferencesGUI())
self.ui.get_object('menuitem_import_bibtex').connect('activate',
self.import_bibtex)
self.ui.get_object('menuitem_author_graph').connect('activate',
lambda x: self.graph_authors())
self.ui.get_object('menuitem_paper_graph').connect('activate',
lambda x: self.graph_papers())
@@ -2546,29 +2545,6 @@
def add_new_author(self, new_author):
self.authors_model.append((new_author.id, new_author.name))

-
-class PreferencesGUI:
- def __init__(self):
- self.ui = gtk.Builder()
- self.ui.add_from_file(RUN_FROM_DIR + 'preferences_gui.xml')
- self.edit_dialog = self.ui.get_object('preferences_dialog')
- self.edit_dialog.connect("delete-event", self.edit_dialog.destroy)
- self.ui.get_object('button_cancel').connect("clicked", lambda x:
self.edit_dialog.destroy())
- self.ui.get_object('button_save').connect("clicked", lambda x:
self.save())
- self.edit_dialog.show()
-
- def save(self):
- self.paper.title = self.ui.get_object('entry_title').get_text()
- self.paper.doi = self.ui.get_object('entry_doi').get_text()
- text_buffer = self.ui.get_object('textview_abstract').get_buffer()
- self.paper.abstract =
text_buffer.get_text(text_buffer.get_start_iter(),
text_buffer.get_end_iter())
- self.paper.save()
- self.edit_dialog.destroy()
- main_gui.refresh_middle_pane_search()
-
-
-
-
def init_db():
import django.core.management.commands.syncdb

django.core.management.commands.syncdb.Command().handle_noargs(interactive=False)
=======================================
--- /ui.xml Sat Feb 11 12:25:20 2012
+++ /ui.xml Wed Feb 15 15:37:49 2012
@@ -82,12 +82,6 @@
</object>
</child>
<child>
- <object class="GtkAction" id="menuitem_preferences">
- <property name="stock_id">gtk-preferences</property>
- <property name="name">menuitem_preferences</property>
- </object>
- </child>
- <child>
<object class="GtkAction" id="menuitem4">
<property name="name">menuitem4</property>
<property name="label" translatable="yes">_View</property>

==============================================================================
Revision: 352731ac9522
Author: Marcel Stimberg <marcel...@gmail.com>
Date: Thu Feb 16 14:37:40 2012
Log: whitespace changes
http://code.google.com/p/gpapers/source/detail?r=352731ac9522

Modified:
/gPapers/models.py

=======================================
--- /gPapers/models.py Thu Feb 9 11:55:54 2012
+++ /gPapers/models.py Thu Feb 16 14:37:40 2012
@@ -21,7 +21,7 @@
import desktop, pyPdf


-p_doi = re.compile( 'doi *: *(10.[a-z0-9]+/[a-z0-9.]+)', re.IGNORECASE )
+p_doi = re.compile('doi *: *(10.[a-z0-9]+/[a-z0-9.]+)', re.IGNORECASE)


class Publisher(models.Model):
@@ -31,12 +31,12 @@
updated = models.DateTimeField(auto_now=True)

class Admin:
- list_display = ( 'id', 'name', )
+ list_display = ('id', 'name',)

def __unicode__(self):
return self.name

-
+
class Source(models.Model):

name = models.CharField(max_length='1024')
@@ -49,17 +49,17 @@
updated = models.DateTimeField(auto_now=True)

def merge(self, id):
- if id==self.id:
+ if id == self.id:
return
other_source = Source.objects.get(id=id)
- if not self.publisher:
+ if not self.publisher:
self.publisher = other_source.publisher
for paper in other_source.paper_set.all():
- self.paper_set.add( paper )
+ self.paper_set.add(paper)
other_source.delete()

class Admin:
- list_display =
( 'id', 'name', 'issue', 'location', 'publisher', 'publication_date', )
+ list_display =
('id', 'name', 'issue', 'location', 'publisher', 'publication_date',)

def __unicode__(self):
return self.name
@@ -73,22 +73,22 @@
updated = models.DateTimeField(auto_now=True)

def merge(self, id):
- if id==self.id:
+ if id == self.id:
return
other_organization = Organization.objects.get(id=id)
for author in other_organization.author_set.all():
- self.author_set.add( author )
+ self.author_set.add(author)
for paper in other_organization.paper_set.all():
- self.paper_set.add( paper )
+ self.paper_set.add(paper)
other_organization.delete()

class Admin:
- list_display = ( 'id', 'name', 'location' )
+ list_display = ('id', 'name', 'location')

def __unicode__(self):
return self.name
-
-
+
+
class Author(models.Model):

name = models.CharField(max_length='1024')
@@ -99,13 +99,13 @@
rating = models.IntegerField(default=0)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
-
+
def merge(self, id):
- if id==self.id:
+ if id == self.id:
return
other_author = Author.objects.get(id=id)
for organization in other_author.organizations.all():
- self.organizations.add( organization )
+ self.organizations.add(organization)
from django.db import connection
cursor = connection.cursor()
# we want to preserve the order of the authors, so do an update
via SQL instead of using the built in set manipulators
@@ -114,12 +114,12 @@
other_author.delete()

class Admin:
- list_display = ( 'id', 'name', 'location' )
+ list_display = ('id', 'name', 'location')

def __unicode__(self):
return self.name
-
-
+
+
class Sponsor(models.Model):

name = models.CharField(max_length='1024')
@@ -127,14 +127,14 @@
updated = models.DateTimeField(auto_now=True)

class Admin:
- list_display = ( 'id', 'name', )
+ list_display = ('id', 'name',)

def __unicode__(self):
return self.name
-
-
+
+
class Paper(models.Model):
-
+
title = models.CharField(max_length='1024')
doi = models.CharField(max_length='1024', blank=True)
pubmed_id = models.CharField(max_length='1024', blank=True)
@@ -147,7 +147,7 @@
authors = models.ManyToManyField(Author)
sponsors = models.ManyToManyField(Sponsor)
organizations = models.ManyToManyField(Organization)
- full_text =
models.FileField(upload_to=os.path.join('papers','%Y','%m'))
+ full_text =
models.FileField(upload_to=os.path.join('papers', '%Y', '%m'))
full_text_md5 = models.CharField(max_length='32', blank=True)
extracted_text = models.TextField(blank=True)
page_count = models.IntegerField(default=0)
@@ -156,7 +156,7 @@
bibtex = models.TextField(blank=True)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
-
+
def save_file(self, filename, raw_contents, save=True):
m = md5.new()
m.update(raw_contents)
@@ -172,33 +172,33 @@
rows = cursor.fetchall()
author_list = []
for row in rows:
- author_list.append( Author.objects.get(id=row[0]) )
+ author_list.append(Author.objects.get(id=row[0]))
return author_list
-
+
def open(self):
- if self.full_text and os.path.isfile( self.full_text.path ):
- desktop.open( self.full_text.path )
+ if self.full_text and os.path.isfile(self.full_text.path):
+ desktop.open(self.full_text.path)
self.read_count = self.read_count + 1
self.save()

def extract_document_information_from_pdf(self, force_overwrite=False):
"""will overwrite the extracted_text and page_count fields, and
the title if the title is empty"""
- if self.full_text and os.path.isfile( self.full_text.path ):
+ if self.full_text and os.path.isfile(self.full_text.path):
content = []

# Load PDF into pyPDF
pdf = pyPdf.PdfFileReader(file(self.full_text.path, "rb"))
doc_info = pdf.getDocumentInfo()
- content.append( str(doc_info) )
+ content.append(str(doc_info))
content.append('\n\n')
if force_overwrite or not self.title:
try: self.title = doc_info['/Title']
except: self.title = os.path.split(self.full_text.path)[1]
- if force_overwrite or self.authors.count()==0:
+ if force_overwrite or self.authors.count() == 0:
try:
author_text = doc_info['/Author']
print 'author_text', author_text
- if author_text.find(';')>0:
+ if author_text.find(';') > 0:
author_list = author_text.split(';')
else:
author_list = author_text.split(',')
@@ -214,28 +214,28 @@
# also has: doc_info['/Author'], doc_info['/ModDate'],
doc_info['/CreationDate']

# extract the actual text
- stdin, stdout = os.popen4( 'ps2txt "%s"' % self.full_text.path
)
+ stdin, stdout = os.popen4('ps2txt "%s"' % self.full_text.path)
for line in stdout:
content.append(line)
try:
self.doi = p_doi.search(line).group(1)
print self.doi
except: pass
-
- self.extracted_text = ''.join( content )
+
+ self.extracted_text = ''.join(content)
else:
self.page_count = 0
self.extracted_text = ''
return self.extracted_text

class Admin:
- list_display = ( 'id', 'doi', 'title' )
+ list_display = ('id', 'doi', 'title')

def __unicode__(self):
- return 'Paper<%i: %s>' % ( self.id, ' '.join( [str(self.doi),
str(self.title), str(self.authors.all())] ) )
-
+ return 'Paper<%i: %s>' % (self.id, ' '.join([str(self.doi),
str(self.title), str(self.authors.all())]))
+
def pretty_string(self):
- return '['+ ', '.join( [ author.name for author in
self.get_authors_in_order() ] ) +'] '+ self.title
+ return '[' + ', '.join([ author.name for author in
self.get_authors_in_order() ]) + '] ' + self.title


class Reference(models.Model):
@@ -252,7 +252,7 @@
updated = models.DateTimeField(auto_now=True)

class Admin:
- list_display =
( 'id', 'referencing_paper', 'line_from_referencing_paper', 'doi_from_referencing_paper', 'referenced_paper', 'line_from_referenced_paper', 'doi_from_referenced_paper'
)
+ list_display =
('id', 'referencing_paper', 'line_from_referencing_paper', 'doi_from_referencing_paper', 'referenced_paper', 'line_from_referenced_paper', 'doi_from_referenced_paper')

def __unicode__(self):
return 'Reference<%s,%s>' % (str(self.referencing_paper),
str(self.referenced_paper))
@@ -270,7 +270,7 @@
updated = models.DateTimeField(auto_now=True)

class Admin:
- list_display = ( 'id', 'paper', 'page' )
+ list_display = ('id', 'paper', 'page')

def __unicode__(self):
return self.notes
@@ -292,7 +292,7 @@
papers = models.ManyToManyField(Paper)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
-
+
def get_papers_in_order(self):
from django.db import connection
cursor = connection.cursor()
@@ -300,11 +300,11 @@
rows = cursor.fetchall()
paper_list = []
for row in rows:
- paper_list.append( Paper.objects.get(id=row[0]) )
+ paper_list.append(Paper.objects.get(id=row[0]))
return paper_list

class Admin:
- list_display = ( 'id', 'title', 'parent', 'search_text' )
+ list_display = ('id', 'title', 'parent', 'search_text')

def __unicode__(self):
return self.title

==============================================================================
Revision: 921d9a218b2e
Author: Marcel Stimberg <marcel...@gmail.com>
Date: Thu Feb 16 14:38:19 2012
Log: Rearrange menu items, refactor and simplify import code a bit
http://code.google.com/p/gpapers/source/detail?r=921d9a218b2e

Modified:
/gPapers.py
/importer/__init__.py
/ui.xml

=======================================
--- /gPapers.py Wed Feb 15 15:37:49 2012
+++ /gPapers.py Thu Feb 16 14:38:19 2012
@@ -1,4 +1,5 @@
#!/usr/bin/env python
+# -*- coding: utf-8 -*-

# gPapers
# Copyright (C) 2007 Derek Anderson
@@ -18,6 +19,7 @@
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

import commands, dircache, getopt, math, os, re, string, sys, thread,
threading, time, traceback, urllib
+import mimetypes
from datetime import date, datetime, timedelta
from time import strptime

@@ -160,10 +162,6 @@
column.set_sort_indicator(True)
column.set_sort_order(sort_order)

-def fetch_citation_via_url(url):
- log_info('trying to fetch: %s' % url)
- t = thread.start_new_thread(importer.import_citation, (url, None,
main_gui.refresh_middle_pane_search))
-
def fetch_citation_via_middle_top_pane_row(row):
t = thread.start_new_thread(import_citation_via_middle_top_pane_row,
(row,))

@@ -175,14 +173,6 @@
log_info('trying to fetch: %s' % str(references))
t = thread.start_new_thread(import_citations_via_references,
(references,))

-def fetch_citations_via_bibtexs(bibtexs):
- log_info('trying to fetch bibtexs: %s' % str(bibtexs))
- t = thread.start_new_thread(import_citations_via_bibtexs, (bibtexs,))
-
-def fetch_documents_via_filenames(filenames):
- log_info('trying to fetch files: %s' % str(filenames))
- t = thread.start_new_thread(import_documents_via_filenames,
(filenames,))
-
def import_citations(urls):
for url in urls:
importer.import_citation(url,
callback=main_gui.refresh_middle_pane_search)
@@ -201,13 +191,41 @@
main_gui.refresh_middle_pane_search()

def import_documents_via_filenames(filenames):
- for filename in filenames:
+ '''
+ Adds existing files or directories to the database and copies the
documents
+ to the MEDIA_ROOT/papers directory.
+ ``filenames`` is a sequence of filenames.
+ '''
+
+ log_info('Starting filename import for %d documents' % len(filenames))
+
+ def get_all_files(basedir, filenames):
+ '''
+ Returns a flat list with all pdf files in the file/directory list
+ '''
+ results = []
+ for filename in filenames:
+ filename = os.path.join(basedir, filename)
+ if os.path.isdir(filename):
+ results.extend(get_all_files(filename,
os.listdir(filename)))
+ elif mimetypes.guess_type(filename)[0] == 'application/pdf':
+ #TODO: Also allow other file types like ps.gz
+ results.append(filename)
+ return results
+
+ all_files = get_all_files('', filenames)
+ # TODO: Show an error message if no file is found?
+
+ for filename in all_files:
data = open(filename, 'r').read()
import_document(filename, data)
+
main_gui.refresh_middle_pane_search()

def import_citations_via_bibtexs(bibtexs):

+ log_info('Starting BibTex import')
+
a_bibtex = []

for line in bibtexs.split('\n'):
@@ -323,8 +341,15 @@
current_middle_top_pane_refresh_thread_ident = None
active_threads = {}

- def import_url(self, o):
- dialog = gtk.MessageDialog(type=gtk.MESSAGE_QUESTION,
buttons=gtk.BUTTONS_OK_CANCEL, flags=gtk.DIALOG_MODAL)
+ def import_url_dialog(self, o):
+ '''
+ Opens a dialog for entering an URL. For importing this URL,
+ ``import_citation`` is called in a new thread.
+ '''
+ dialog = gtk.MessageDialog(parent=self.main_window,
+ type=gtk.MESSAGE_QUESTION,
+ buttons=gtk.BUTTONS_OK_CANCEL,
+ flags=gtk.DIALOG_MODAL)
#dialog.connect('response', lambda x,y: dialog.destroy())
dialog.set_markup('<b>Import URL...</b>\n\nEnter the URL you would
like to import:')
entry = gtk.Entry()
@@ -334,11 +359,22 @@
dialog.show_all()
response = dialog.run()
if response == gtk.RESPONSE_OK:
- fetch_citation_via_url(entry.get_text())
+ url = entry.get_text()
+ threading.Thread(target=importer.import_citation,
+ args=(url, None,
+
main_gui.refresh_middle_pane_search)).start()
dialog.destroy()

- def import_doi(self, o):
- dialog = gtk.MessageDialog(type=gtk.MESSAGE_QUESTION,
buttons=gtk.BUTTONS_OK_CANCEL, flags=gtk.DIALOG_MODAL)
+ def import_doi_dialog(self, o):
+ '''
+ Opens a dialog for entering a DOI. For importing this document
from the
+ http://dx.doi.org/... URL, ``import_citation`` is called in a new
+ thread.
+ '''
+ dialog = gtk.MessageDialog(parent=self.main_window,
+ type=gtk.MESSAGE_QUESTION,
+ buttons=gtk.BUTTONS_OK_CANCEL,
+ flags=gtk.DIALOG_MODAL)
#dialog.connect('response', lambda x,y: dialog.destroy())
dialog.set_markup('<b>Import via DOI...</b>\n\nEnter the DOI name
(e.g., 10.1000/182) you would like to import:')
entry = gtk.Entry()
@@ -348,45 +384,64 @@
dialog.show_all()
response = dialog.run()
if response == gtk.RESPONSE_OK:
- fetch_citation_via_url('http://dx.doi.org/' +
entry.get_text().strip())
+ url = 'http://dx.doi.org/' + entry.get_text().strip()
+ threading.Thread(target=importer.import_citation,
+ args=(url, None,
+
main_gui.refresh_middle_pane_search)).start()
dialog.destroy()

- def import_file(self, o):
- dialog = gtk.FileChooserDialog(title='Select a PDF to import...',
parent=None, action=gtk.FILE_CHOOSER_ACTION_OPEN,
buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN,
gtk.RESPONSE_OK), backend=None)
- #dialog.connect('response', lambda x,y: dialog.destroy())
+ def import_file_dialog(self, o):
+ '''
+ Opens a dialog for chosing one or several files. If any files are
+ chosen, ``import_documents_via_filenames`` is called in a new
thread.
+ '''
+ dialog = gtk.FileChooserDialog(title='Select one or more files
import…',
+ parent=self.main_window,
+ action=gtk.FILE_CHOOSER_ACTION_OPEN,
+ buttons=(gtk.STOCK_CANCEL,
+ gtk.RESPONSE_CANCEL,
+ gtk.STOCK_OPEN,
+ gtk.RESPONSE_OK))
dialog.set_default_response(gtk.RESPONSE_OK)
dialog.set_select_multiple(True)
dialog.show_all()
response = dialog.run()
if response == gtk.RESPONSE_OK:
- fetch_documents_via_filenames(dialog.get_filenames())
+ threading.Thread(target=import_documents_via_filenames,
+ args=(dialog.get_filenames(),)).start()
dialog.destroy()

- def import_directory(self, o):
- dialog = gtk.FileChooserDialog(title='Select a directory to
import...', parent=None, action=gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER,
buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN,
gtk.RESPONSE_OK), backend=None)
- #dialog.connect('response', lambda x,y: dialog.destroy())
+ def import_directory_dialog(self, o):
+ '''
+ Opens a dialog for chosing a directory. If a directory is chosen,
+ ``import_documents_via_filenames`` is called in a new thread.
+ '''
+ dialog = gtk.FileChooserDialog(title='Select a directory to
import…',
+ parent=self.main_window,
+
action=gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ buttons=(gtk.STOCK_CANCEL,
+ gtk.RESPONSE_CANCEL,
+ gtk.STOCK_OPEN,
+ gtk.RESPONSE_OK))
dialog.set_default_response(gtk.RESPONSE_OK)
dialog.set_select_multiple(True)
dialog.show_all()
response = dialog.run()
if response == gtk.RESPONSE_OK:
- dirs = set([ os.path.join(dialog.get_current_folder(), x) for
x in dialog.get_filenames() ])
- pdf_filenames = set()
- while dirs:
- dir = dirs.pop()
- if os.path.isdir(dir):
- for filename in os.listdir(dir):
- if filename == '.Trash': continue
- filename = os.path.join(dir, filename)
- if os.path.isdir(filename) and not
filename.startswith(settings.MEDIA_ROOT):
- dirs.add(filename)
- elif filename.lower().endswith('.pdf'):
- pdf_filenames.add(filename)
- fetch_documents_via_filenames(pdf_filenames)
+ threading.Thread(target=import_documents_via_filenames,
+ args=(dialog.get_filenames(),)).start()
dialog.destroy()

- def import_bibtex(self, o):
- dialog = gtk.MessageDialog(type=gtk.MESSAGE_QUESTION,
buttons=gtk.BUTTONS_OK_CANCEL, flags=gtk.DIALOG_MODAL)
+ def import_bibtex_dialog(self, o):
+ '''
+ Opens a dialog for entering/pasting BibTex information. For
importing
+ the information, ``import_documents_via_bibtexs`` is called in a
new
+ thread.
+ '''
+ dialog = gtk.MessageDialog(parent=self.main_window,
+ type=gtk.MESSAGE_QUESTION,
+ buttons=gtk.BUTTONS_OK_CANCEL,
+ flags=gtk.DIALOG_MODAL)
#dialog.connect('response', lambda x,y: dialog.destroy())
dialog.set_markup('<b>Import BibTex...</b>\n\nEnter the BibTex
entry (or entries) you would like to import:')
entry = gtk.TextView()
@@ -399,15 +454,18 @@
response = dialog.run()
if response == gtk.RESPONSE_OK:
text_buffer = entry.get_buffer()
-
fetch_citations_via_bibtexs(text_buffer.get_text(text_buffer.get_start_iter(),
text_buffer.get_end_iter()))
+ bibtex = text_buffer.get_text(text_buffer.get_start_iter(),
+ text_buffer.get_end_iter())
+ threading.Thread(target=import_citations_via_bibtexs,
+ args=(bibtex,)).start()
dialog.destroy()

def __init__(self):
gnome.init(PROGRAM, VERSION)
self.ui = gtk.Builder()
self.ui.add_from_file(RUN_FROM_DIR + 'ui.xml')
- main_window = self.ui.get_object('main_window')
- main_window.connect("delete-event", lambda x, y: sys.exit(0))
+ self.main_window = self.ui.get_object('main_window')
+ self.main_window.connect("delete-event", lambda x, y: sys.exit(0))
self.init_menu()
self.init_search_box()
self.init_left_pane()
@@ -421,7 +479,7 @@
self.pubmed_search = pubmed.PubMedSearch()
self.google_scholar_search = google_scholar.GoogleScholarSearch()
self.jstor_search = jstor.JSTORSearch()
- main_window.show()
+ self.main_window.show()

def init_busy_notifier(self):
busy_notifier = self.ui.get_object('busy_notifier')
@@ -465,15 +523,14 @@

def init_menu(self):
self.ui.get_object('menuitem_quit').connect('activate', lambda x:
sys.exit(0))
- self.ui.get_object('menuitem_import_url').connect('activate',
self.import_url)
- self.ui.get_object('menuitem_import_doi').connect('activate',
self.import_doi)
- self.ui.get_object('menuitem_import_file').connect('activate',
self.import_file)
-
self.ui.get_object('menuitem_import_directory').connect('activate',
self.import_directory)
- self.ui.get_object('menuitem_import_bibtex').connect('activate',
self.import_bibtex)
+ self.ui.get_object('menuitem_import_url').connect('activate',
self.import_url_dialog)
+ self.ui.get_object('menuitem_import_doi').connect('activate',
self.import_doi_dialog)
+ self.ui.get_object('menuitem_import_files').connect('activate',
self.import_file_dialog)
+
self.ui.get_object('menuitem_import_directory').connect('activate',
self.import_directory_dialog)
+ self.ui.get_object('menuitem_import_bibtex').connect('activate',
self.import_bibtex_dialog)
self.ui.get_object('menuitem_author_graph').connect('activate',
lambda x: self.graph_authors())
self.ui.get_object('menuitem_paper_graph').connect('activate',
lambda x: self.graph_papers())
self.ui.get_object('menuitem_about').connect('activate',
self.show_about_dialog)
- self.ui.get_object('menuitem_check_updates').connect('activate',
lambda x: self.check_for_updates())

def init_search_box(self):
thread.start_new_thread(self.watch_middle_pane_search, ())
@@ -1673,7 +1730,7 @@
dialog.destroy()
if response == gtk.RESPONSE_YES:
for paper in papers:
- log_info('deleting paper: %s', str(paper))
+ log_info('deleting paper: %s' % str(paper))
paper.delete()
self.refresh_middle_pane_search()

=======================================
--- /importer/__init__.py Sun Feb 12 09:35:11 2012
+++ /importer/__init__.py Thu Feb 16 14:38:19 2012
@@ -250,6 +250,9 @@
#TODO: Refactor import_pdf into a new function

def import_citation(url, paper=None, callback=None):
+
+ log_info('Importing URL: %s' % url)
+
active_threads[ thread.get_ident() ] = 'importing: ' + url
try:
response = urllib.urlopen(url)
=======================================
--- /ui.xml Wed Feb 15 15:37:49 2012
+++ /ui.xml Thu Feb 16 14:38:19 2012
@@ -1,48 +1,43 @@
<?xml version="1.0"?>
<interface>
+ <requires lib="gtk+" version="2.16"/>
<object class="GtkUIManager" id="uimanager1">
<child>
<object class="GtkActionGroup" id="actiongroup1">
<child>
- <object class="GtkAction" id="menuitem1">
- <property name="name">menuitem1</property>
+ <object class="GtkAction" id="menuitem_files">
+ <property name="name">menuitem_files</property>
<property name="label" translatable="yes">_File</property>
</object>
</child>
<child>
- <object class="GtkAction" id="menuitem2">
- <property name="name">menuitem2</property>
- <property name="label" translatable="yes">Import</property>
+ <object class="GtkAction" id="menuitem_import_files">
+ <property name="name">menuitem_import_files</property>
+ <property name="label" translatable="yes">Import
Files…</property>
</object>
- </child>
+ </child>
+ <child>
+ <object class="GtkAction" id="menuitem_import_directory">
+ <property name="name">menuitem_import_directory</property>
+ <property name="label" translatable="yes">Import
Directory…</property>
+ </object>
+ </child>
<child>
<object class="GtkAction" id="menuitem_import_url">
<property name="name">menuitem_import_url</property>
- <property name="label" translatable="yes">Citation
URL...</property>
+ <property name="label" translatable="yes">Import
URL…</property>
</object>
</child>
<child>
<object class="GtkAction" id="menuitem_import_doi">
<property name="name">menuitem_import_doi</property>
- <property name="label" translatable="yes">DOI...</property>
- </object>
- </child>
- <child>
- <object class="GtkAction" id="menuitem_import_file">
- <property name="name">menuitem_import_file</property>
- <property name="label" translatable="yes">Files...</property>
- </object>
- </child>
- <child>
- <object class="GtkAction" id="menuitem_import_directory">
- <property name="name">menuitem_import_directory</property>
- <property name="label"
translatable="yes">Directory...</property>
+ <property name="label" translatable="yes">Import
DOI…</property>
</object>
</child>
<child>
<object class="GtkAction" id="menuitem_import_bibtex">
<property name="name">menuitem_import_bibtex</property>
- <property name="label" translatable="yes">BibTex...</property>
+ <property name="label" translatable="yes">Import
BibTex…</property>
</object>
</child>
<child>
@@ -52,37 +47,37 @@
</object>
</child>
<child>
- <object class="GtkAction" id="menuitem3">
- <property name="name">menuitem3</property>
+ <object class="GtkAction" id="menuitem_edit">
+ <property name="name">menuitem_edit</property>
<property name="label" translatable="yes">_Edit</property>
</object>
</child>
<child>
- <object class="GtkAction" id="imagemenuitem1">
+ <object class="GtkAction" id="menuitem_cut">
<property name="stock_id">gtk-cut</property>
- <property name="name">imagemenuitem1</property>
+ <property name="name">menuitem_cut</property>
</object>
</child>
<child>
- <object class="GtkAction" id="imagemenuitem2">
+ <object class="GtkAction" id="menuitem_copy">
<property name="stock_id">gtk-copy</property>
- <property name="name">imagemenuitem2</property>
+ <property name="name">menuitem_copy</property>
</object>
</child>
<child>
- <object class="GtkAction" id="imagemenuitem3">
+ <object class="GtkAction" id="menuitem_paste">
<property name="stock_id">gtk-paste</property>
- <property name="name">imagemenuitem3</property>
+ <property name="name">menuitem_paste</property>
</object>
</child>
<child>
- <object class="GtkAction" id="imagemenuitem4">
+ <object class="GtkAction" id="menuitem_delete">
<property name="stock_id">gtk-delete</property>
- <property name="name">imagemenuitem4</property>
+ <property name="name">menuitem_delete</property>
</object>
</child>
<child>
- <object class="GtkAction" id="menuitem4">
+ <object class="GtkAction" id="menuitem_view">
<property name="name">menuitem4</property>
<property name="label" translatable="yes">_View</property>
</object>
@@ -100,19 +95,12 @@
</object>
</child>
<child>
- <object class="GtkAction" id="menuitem8">
- <property name="name">menuitem8</property>
+ <object class="GtkAction" id="menuitem_help">
+ <property name="name">menuitem_help</property>
<property name="label" translatable="yes">_Help</property>
</object>
</child>
<child>
- <object class="GtkAction" id="menuitem_check_updates">
- <property name="stock_id">gtk-network</property>
- <property name="name">menuitem_check_updates</property>
- <property name="label" translatable="yes">Check for
updates...</property>
- </object>
- </child>
- <child>
<object class="GtkAction" id="menuitem_about">
<property name="stock_id">gtk-about</property>
<property name="name">menuitem_about</property>
@@ -122,31 +110,27 @@
</child>
<ui>
<menubar name="menubar1">
- <menu action="menuitem1">
- <menu action="menuitem2">
- <menuitem action="menuitem_import_url"/>
- <menuitem action="menuitem_import_doi"/>
- <menuitem action="menuitem_import_file"/>
- <menuitem action="menuitem_import_directory"/>
- <menuitem action="menuitem_import_bibtex"/>
- </menu>
+ <menu action="menuitem_files">
+ <menuitem action="menuitem_import_files"/>
+ <menuitem action="menuitem_import_directory"/>
+ <menuitem action="menuitem_import_url"/>
+ <menuitem action="menuitem_import_doi"/>
+ <menuitem action="menuitem_import_bibtex"/>
<separator/>
<menuitem action="menuitem_quit"/>
</menu>
- <menu action="menuitem3">
- <menuitem action="imagemenuitem1"/>
- <menuitem action="imagemenuitem2"/>
- <menuitem action="imagemenuitem3"/>
- <menuitem action="imagemenuitem4"/>
- <separator/>
- <menuitem action="menuitem_preferences"/>
+ <menu action="menuitem_edit">
+ <menuitem action="menuitem_cut"/>
+ <menuitem action="menuitem_copy"/>
+ <menuitem action="menuitem_paste"/>
+ <menuitem action="menuitem_delete"/>
+
</menu>
- <menu action="menuitem4">
+ <menu action="menuitem_view">
<menuitem action="menuitem_author_graph"/>
<menuitem action="menuitem_paper_graph"/>
</menu>
- <menu action="menuitem8">
- <menuitem action="menuitem_check_updates"/>
+ <menu action="menuitem_help">
<menuitem action="menuitem_about"/>
</menu>
</menubar>
Reply all
Reply to author
Forward
0 new messages