Source code for model
#!/usr/bin/env python
import bibtexparser
import Tkinter as tk
from Tkinter import *
from ttk import *
import Tkinter, Tkconstants, tkFileDialog
[docs]class Model():
"""Creates and maintains the MongoDb and Bibtex databases"""
def __init__(self,conn,master,local):
"""define mongoDB database"""
self.mongo_db = conn.bibtex_files
self.mongo_db.mongo_local.drop()
self.mongo_db.mongo_master.drop()
""" define collection where I'll insert my local files data"""
mongo_local = self.mongo_db.mongo_local
""" define collection where I'll insert my master files data"""
mongo_master = self.mongo_db.mongo_master
with open(local) as bibtex_file:
bibtex_str = bibtex_file.read()
"""create bibtex database for local file"""
self.bibdb_local = bibtexparser.loads(bibtex_str)
for entry_dict in self.bibdb_local.entries:
mongo_local.insert(entry_dict)
with open(master) as bibtex_file:
bibtex_str = bibtex_file.read()
"""create bibtex database for master file"""
bibdb_master = bibtexparser.loads(bibtex_str)
for entry_dict in bibdb_master.entries:
mongo_master.insert(entry_dict)
delete_duplicates_from_collection(self.mongo_db.mongo_local)
delete_duplicates_from_collection(self.mongo_db.mongo_master)
[docs] def update_bibtexDB(self,is_update):
"""Update the bibtex database with the records from the mongo database
Args:
is_update:Flag indicates if the user made any selections to update the current local file
"""
update_bibtex_mongoDB(is_update,self.bibdb_local,self.mongo_db.mongo_local)
[docs] def update(self,is_update,list_change,list_add):
"""Update the mongodb collections
Args:
is_update:Flag indicates if the user made any selections to update the current local file
list_change: List of properties for each record that have different values on the master file and the local file
list_add: List of properties for each record that are present on the master file but not on the local
"""
if(is_update):
change_property_db(list_change,self.mongo_db.mongo_local)
add_property_db(list_add,self.mongo_db.mongo_local)
def close(self):
self.mongo_db.mongo_local.drop()
self.mongo_db.mongo_master.drop()
[docs]def change_property_db(list, db_coll):
"""Update the records in the database collection with the modified values from the list
Args:
list: List of properties for each record that have different values on the master file and the local file
db_coll: database collection that will to be updated
"""
for idx,val in enumerate(list):
if (list[idx][2][3].get()):
result = db_coll.update(
{"ID":list[idx][0]},
{"$set":{list[idx][1][0]:list[idx][2][1]},
"$currentDate": {"lastModified":True}
}
)
# tk.destroy()
[docs]def add_property_db(list,db_coll):
"""Update the records in the database collection with the values from the list
Args:
list: List of properties for each record that are present on the master file but not on the local
db_coll: database collection that will to be updated
"""
for idx,val in enumerate(list):
result = db_coll.update(
{"ID":list[idx][0]},
{"$set":{list[idx][1][0]:list[idx][1][1]}}
)
[docs]def delete_duplicates_from_collection(coll):
""" Deletes duplicates entries from the collection
Args:
coll: Mongo Database Collection
"""
for element in coll.find():
for entry in element:
if(entry =="ID"):
val = element[entry]
temp = element
coll.remove({"ID":val})
coll.insert_one(temp)
[docs]def update_bibtex_mongoDB(is_update,bibdatabase,mongodb_coll):
"""Updates the bibtex database by comparing the properties for each record with records from the mongo database
Args:
is_update:Flag indicates if the user made any selections to update the current local file
bibdatabase: Bibtex database that needs to be updated
mongodb_coll:Mongo database collection
"""
if(is_update):
for dict in bibdatabase.entries:
change = False
if dict.has_key("_id"):
dict.pop("_id")
cursor = mongodb_coll.find({"ID":dict["ID"]})
if(cursor.count>0):
for doc in cursor:
record = doc
change = True
if change:
for each in doc.items():
if(each[0]!="_id" and each[0]!="lastModified"):
dict[each[0]]=each[1]