Skip to content
Snippets Groups Projects
Commit c0a85dd4 authored by Johann Jacobsohn's avatar Johann Jacobsohn
Browse files

add "submit new paper" feature

parent 17b35d20
No related branches found
No related tags found
No related merge requests found
...@@ -45,6 +45,7 @@ class PaperDTO: ...@@ -45,6 +45,7 @@ class PaperDTO:
year: int year: int
abstract: str abstract: str
doi: str doi: str
slug: str
class Bibtex: class Bibtex:
...@@ -95,7 +96,10 @@ class Doi: ...@@ -95,7 +96,10 @@ class Doi:
if "abstract" in info if "abstract" in info
else "Abstract N/A") else "Abstract N/A")
return PaperDTO(author, authors, title, journal, year, abstract, doi) slug = f"{info['author'][0]['family']}{year}"
return PaperDTO(author, authors, title, journal, year, abstract, doi,
slug)
def get_bibtex(self, doi): def get_bibtex(self, doi):
headers = { headers = {
...@@ -104,8 +108,12 @@ class Doi: ...@@ -104,8 +108,12 @@ class Doi:
return requests.get(f'http://dx.doi.org/{doi}', headers=headers).text return requests.get(f'http://dx.doi.org/{doi}', headers=headers).text
def get_info(self, doi): def get_info(self, doi):
try:
jsoncontent = self.load_doi_data(doi) jsoncontent = self.load_doi_data(doi)
return self.parse_doi_json(jsoncontent) data = self.parse_doi_json(jsoncontent)
return data
except json.decoder.JSONDecodeError:
return None
def extract_doi(self, hay): def extract_doi(self, hay):
"""Parse doi from string, or None if not found. """Parse doi from string, or None if not found.
...@@ -188,12 +196,22 @@ class Mattermost: ...@@ -188,12 +196,22 @@ class Mattermost:
self.msgs = self.filter_incoming(msgs) self.msgs = self.filter_incoming(msgs)
return self.msgs return self.msgs
def check_doi_exits(self, doi):
doi_needle = Doi().extract_doi(doi)
msg_found = [msg for msg in self.msgs
if Doi().extract_doi(msg.doi) == doi_needle]
return bool(msg_found)
def get_filtered(self, needle): def get_filtered(self, needle):
"""Filter posts by needle.""" """Filter posts by needle."""
return [m for m in self.msgs return [m for m in self.msgs
if needle.lower() in m.message.lower() if needle.lower() in m.message.lower()
or needle.lower() in m.reporter.lower()] or needle.lower() in m.reporter.lower()]
def post(self, message):
self.mattermost.posts.create_post({"channel_id": self.channel,
"message": message})
class PrettyButton(urwid.WidgetWrap): class PrettyButton(urwid.WidgetWrap):
def __init__(self, label, on_press=None, user_data=None): def __init__(self, label, on_press=None, user_data=None):
...@@ -247,6 +265,8 @@ class Papersurfer: ...@@ -247,6 +265,8 @@ class Papersurfer:
exitbutton = PrettyButton(u'Exit', on_press=self.on_exit_clicked) exitbutton = PrettyButton(u'Exit', on_press=self.on_exit_clicked)
self.exportbutton = PrettyButton(u'Export filtered list as bibtex', self.exportbutton = PrettyButton(u'Export filtered list as bibtex',
on_press=self.on_export_clicked) on_press=self.on_export_clicked)
submitbutton = PrettyButton('Submit paper',
on_press=self.open_submit_paper)
div = urwid.Divider(u'-') div = urwid.Divider(u'-')
self.mtm = Mattermost(url, channel, username, password) self.mtm = Mattermost(url, channel, username, password)
...@@ -256,9 +276,14 @@ class Papersurfer: ...@@ -256,9 +276,14 @@ class Papersurfer:
paperlist = urwid.BoxAdapter(urwid.ListBox(self.listcontent), paperlist = urwid.BoxAdapter(urwid.ListBox(self.listcontent),
self.size[1] - 5) self.size[1] - 5)
pile = urwid.Pile([ask, div, paperlist, div, buttonrow = urwid.Columns([exitbutton, self.exportbutton,
urwid.Columns([exitbutton, self.exportbutton])]) submitbutton])
self.top = urwid.Filler(pile, valign='middle') self.pile = urwid.Pile([ask,
div,
paperlist,
div,
buttonrow])
self.top = urwid.Filler(self.pile, valign='middle')
self._pile = urwid.Pile( self._pile = urwid.Pile(
[ [
self.loading_indicator() self.loading_indicator()
...@@ -274,13 +299,12 @@ class Papersurfer: ...@@ -274,13 +299,12 @@ class Papersurfer:
) )
urwid.connect_signal(ask, 'change', self.onchange) urwid.connect_signal(ask, 'change', self.onchange)
self.main = pile
self.mainloop = urwid.MainLoop(self._over, self._palette, self.mainloop = urwid.MainLoop(self._over, self._palette,
unhandled_input=self.h_input ) unhandled_input=self.h_unhandled_input)
self.mainloop.set_alarm_in(.1, self.load_list) self.mainloop.set_alarm_in(.1, self.load_list)
self.mainloop.run() self.mainloop.run()
def h_input(self, key): def h_unhandled_input(self, key):
if key == "esc": if key == "esc":
raise urwid.ExitMainLoop() raise urwid.ExitMainLoop()
...@@ -323,7 +347,7 @@ class Papersurfer: ...@@ -323,7 +347,7 @@ class Papersurfer:
body = urwid.LineBox(body_padding) body = urwid.LineBox(body_padding)
# Footer # Footer
footer = PrettyButton('Okay', self.close_details) footer = PrettyButton('Okay', self.h_close_dialog)
footer = urwid.GridFlow([footer], 8, 1, 1, 'center') footer = urwid.GridFlow([footer], 8, 1, 1, 'center')
# Layout # Layout
...@@ -427,9 +451,30 @@ class Papersurfer: ...@@ -427,9 +451,30 @@ class Papersurfer:
paper = Doi().get_info(post.doi) paper = Doi().get_info(post.doi)
self.mainloop.widget = self.details_popup(paper) self.mainloop.widget = self.details_popup(paper)
def close_details(self, _): def h_close_dialog(self, _):
self.close_dialog()
def close_dialog(self):
self.mainloop.widget = self.top self.mainloop.widget = self.top
def open_submit_paper(self, _):
self._pile = urwid.Pile(
[
PostDialog(self.mtm, close=self.h_close_dialog)
]
)
self._over = urwid.Overlay(
self._pile,
self.top,
align='center',
valign='middle',
width=100,
height=200
)
self.mainloop.widget = self._over
def get_config_file_paths(): def get_config_file_paths():
"""Find, load and parse a config file. """Find, load and parse a config file.
...@@ -526,6 +571,81 @@ def parse_args(): ...@@ -526,6 +571,81 @@ def parse_args():
return options.url, options.channel, options.username, options.password return options.url, options.channel, options.username, options.password
class PostDialog(urwid.WidgetWrap):
"""
UI:
DOI: [ _________________]
Generated Message:
"# # # # # # # #"
[Submit] [Close]
"""
def __init__(self, mattermost, close):
self.mattermost = mattermost
self.close = close
self.doi_input = urwid.Edit("Doi: ")
urwid.connect_signal(self.doi_input, 'change', self.h_input)
self.doi_result = urwid.Text("")
body_pile = urwid.Pile([
self.doi_input,
urwid.Divider(" "),
self.doi_result,
urwid.Divider(" "),
urwid.Columns([
PrettyButton("Close", self.close),
PrettyButton("Submit", self.submit)
]),
])
body_filler = urwid.Filler(body_pile, valign='top')
body_padding = urwid.Padding(
body_filler,
left=1,
right=1
)
body = urwid.LineBox(body_padding)
frame = urwid.Frame(
body,
header=urwid.Text("Submit new paper to list"),
)
self.widget = frame
super(self.__class__, self).__init__(self.widget)
def submit(self, _):
if not self.mattermost.check_doi_exits(self.doi):
self.mattermost.post(self.msg)
self.close(_)
def create_mgs(self, paper):
msg = f"""\
{paper.title}
{paper.authors}
{paper.journal} [{paper.slug}]
{Doi().get_doi_link(paper.doi)}"""
return msg
def h_input(self, _, doi):
self.doi_result.set_text("... loading ...")
self.doi = None
self.msg = None
if Doi().extract_doi(doi):
paper = Doi().get_info(doi)
if paper:
if self.mattermost.check_doi_exits(doi):
self.doi_result.set_text(f"{self.create_mgs(paper)} \n"
"-> Paper already posted! <-")
else:
self.doi_result.set_text(self.create_mgs(paper))
self.doi = doi
self.msg = self.create_mgs(paper)
return
self.doi_result.set_text("invalid doi")
def main(): def main():
URL, CHANNEL, USERNAME, PASSWORD = parse_args() URL, CHANNEL, USERNAME, PASSWORD = parse_args()
Papersurfer(URL, CHANNEL, USERNAME, PASSWORD) Papersurfer(URL, CHANNEL, USERNAME, PASSWORD)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment