Skip to content

Instantly share code, notes, and snippets.

@rmehta
Last active August 29, 2015 14:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rmehta/415e6e8220ec6546040d to your computer and use it in GitHub Desktop.
Save rmehta/415e6e8220ec6546040d to your computer and use it in GitHub Desktop.
Import Jobs From CSV
import csv
NAME = 2
EMAIL = 3
INTRODUCTION = 4
THOUGHTS_ON_COMPANY = 5
LIKES = 6
LINKS = 7
PHONE = 8
def sync():
print "logging in..."
client = FrappeClient("https://webnotes.frappecloud.com", "xxxx", "xxxx")
with open("jobs.csv", "rU") as jobsfile:
reader = csv.reader(jobsfile, dialect='excel')
for row in reader:
if row[0]=="Timestamp":
continue
print "finding " + row[EMAIL]
name = client.get_value("Job Applicant", "name", {"email_id": row[EMAIL]})
if name:
doc = client.get_doc("Job Applicant", name["name"])
else:
doc = {"doctype":"Job Applicant"}
doc["applicant_name"] = row[NAME]
doc["email_id"] = row[EMAIL]
doc["introduction"] = row[INTRODUCTION]
doc["thoughts_on_company"] = row[THOUGHTS_ON_COMPANY]
doc["likes"] = row[LIKES]
doc["links"] = row[LINKS]
doc["phone_number"] = row[PHONE]
if doc.get("status") != "Rejected":
doc["status"] = "Filled Form"
if name:
client.update(doc)
print "Updated " + row[EMAIL]
else:
client.insert(doc)
print "Inserted " + row[EMAIL]
import requests
import json
class AuthError(Exception):
pass
class FrappeException(Exception):
pass
class FrappeClient(object):
def __init__(self, url, username, password):
self.session = requests.Session()
self.url = url
self.login(username, password)
def __enter__(self):
return self
def __exit__(self, *args, **kwargs):
self.logout()
def login(self, username, password):
r = self.session.post(self.url, data={
'cmd': 'login',
'usr': username,
'pwd': password
})
if r.json().get('message') == "Logged In":
return r.json()
else:
raise AuthError
def logout(self):
self.session.get(self.url, params={
'cmd': 'logout',
})
def insert(self, doc):
res = self.session.post(self.url + "/api/resource/" + doc.get("doctype"),
data={"data":json.dumps(doc)})
return self.post_process(res)
def update(self, doc):
url = self.url + "/api/resource/" + doc.get("doctype") + "/" + doc.get("name")
res = self.session.put(url, data={"data":json.dumps(doc)})
return self.post_process(res)
def bulk_update(self, docs):
return self.post_request({
"cmd": "frappe.client.bulk_update",
"docs": json.dumps(docs)
})
def delete(self, doctype, name):
return self.post_request({
"cmd": "frappe.model.delete_doc",
"doctype": doctype,
"name": name
})
def submit(self, doclist):
return self.post_request({
"cmd": "frappe.client.submit",
"doclist": json.dumps(doclist)
})
def get_value(self, doctype, fieldname=None, filters=None):
return self.get_request({
"cmd": "frappe.client.get_value",
"doctype": doctype,
"fieldname": fieldname or "name",
"filters": json.dumps(filters)
})
def set_value(self, doctype, docname, fieldname, value):
return self.post_request({
"cmd": "frappe.client.set_value",
"doctype": doctype,
"name": docname,
"fieldname": fieldname,
"value": value
})
def cancel(self, doctype, name):
return self.post_request({
"cmd": "frappe.client.cancel",
"doctype": doctype,
"name": name
})
def get_doc(self, doctype, name=None, filters=None):
params = {}
if filters:
params["filters"] = json.dumps(filters)
res = self.session.get(self.url + "/api/resource/" + doctype + "/" + name,
params=params)
return self.post_process(res)
def rename_doc(self, doctype, old_name, new_name):
params = {
"cmd": "frappe.client.rename_doc",
"doctype": doctype,
"old_name": old_name,
"new_name": new_name
}
return self.post_request(params)
def get_request(self, params):
res = self.session.get(self.url, params=self.preprocess(params))
res = self.post_process(res)
return res
def post_request(self, data):
res = self.session.post(self.url, data=self.preprocess(data))
res = self.post_process(res)
return res
def preprocess(self, params):
"""convert dicts, lists to json"""
for key, value in params.iteritems():
if isinstance(value, (dict, list)):
params[key] = json.dumps(value)
return params
def post_process(self, response):
try:
rjson = response.json()
except ValueError:
print response.text
raise
if rjson and ("exc" in rjson) and rjson["exc"]:
raise FrappeException(rjson["exc"])
if 'message' in rjson:
return rjson['message']
elif 'data' in rjson:
return rjson['data']
else:
return None
if __name__=="__main__":
sync()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment