-webnotes +frappe 💥

This commit is contained in:
Rushabh Mehta 2014-02-14 14:54:37 +05:30
parent 876d05b081
commit 024ddfcc5b
842 changed files with 6345 additions and 6345 deletions

View file

@ -4,23 +4,23 @@ include *.json
include *.md
include *.py
include *.txt
recursive-include webnotes *.css
recursive-include webnotes *.dat
recursive-include webnotes *.eot
recursive-include webnotes *.gif
recursive-include webnotes *.html
recursive-include webnotes *.jpg
recursive-include webnotes *.js
recursive-include webnotes *.json
recursive-include webnotes *.md
recursive-include webnotes *.otf
recursive-include webnotes *.png
recursive-include webnotes *.py
recursive-include webnotes *.sql
recursive-include webnotes *.svg
recursive-include webnotes *.swf
recursive-include webnotes *.ttf
recursive-include webnotes *.woff
recursive-include webnotes *.xml
recursive-include webnotes *.txt
recursive-include frappe *.css
recursive-include frappe *.dat
recursive-include frappe *.eot
recursive-include frappe *.gif
recursive-include frappe *.html
recursive-include frappe *.jpg
recursive-include frappe *.js
recursive-include frappe *.json
recursive-include frappe *.md
recursive-include frappe *.otf
recursive-include frappe *.png
recursive-include frappe *.py
recursive-include frappe *.sql
recursive-include frappe *.svg
recursive-include frappe *.swf
recursive-include frappe *.ttf
recursive-include frappe *.woff
recursive-include frappe *.xml
recursive-include frappe *.txt
recursive-exclude * *.pyc

View file

@ -1,7 +1,7 @@
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
# MIT License. See license.txt
"""
globals attached to webnotes module
globals attached to frappe module
+ some utility functions that should probably be moved
"""
@ -15,7 +15,7 @@ import os, sys, importlib, inspect
import json
import semantic_version
from webnotes.core.doctype.print_format.print_format import get_html as get_print_html
from frappe.core.doctype.print_format.print_format import get_html as get_print_html
local = Local()
@ -47,17 +47,17 @@ def _(msg):
if local.lang == "en":
return msg
from webnotes.translate import get_full_dict
from frappe.translate import get_full_dict
return get_full_dict(local.lang).get(msg, msg)
def get_lang_dict(fortype, name=None):
if local.lang=="en":
return {}
from webnotes.translate import get_dict
from frappe.translate import get_dict
return get_dict(fortype, name)
def set_user_lang(user, user_language=None):
from webnotes.translate import get_lang_dict
from frappe.translate import get_lang_dict
if not user_language:
user_language = conn.get_value("Profile", user, "language")
@ -140,7 +140,7 @@ _memc = None
def cache():
global _memc
if not _memc:
from webnotes.memc import MClient
from frappe.memc import MClient
_memc = MClient(['localhost:11211'])
return _memc
@ -220,9 +220,9 @@ def connect(site=None, db_name=None):
set_user("Administrator")
def set_user(username):
import webnotes.profile
import frappe.profile
local.session["user"] = username
local.user = webnotes.profile.Profile(username)
local.user = frappe.profile.Profile(username)
local.restrictions = None
local.user_perms = {}
@ -230,11 +230,11 @@ def get_request_header(key, default=None):
return request.headers.get(key, default)
def sendmail(recipients=[], sender="", subject="No Subject", message="No Message", as_markdown=False):
import webnotes.utils.email_lib
import frappe.utils.email_lib
if as_markdown:
webnotes.utils.email_lib.sendmail_md(recipients, sender=sender, subject=subject, msg=message)
frappe.utils.email_lib.sendmail_md(recipients, sender=sender, subject=subject, msg=message)
else:
webnotes.utils.email_lib.sendmail(recipients, sender=sender, subject=subject, msg=message)
frappe.utils.email_lib.sendmail(recipients, sender=sender, subject=subject, msg=message)
logger = None
whitelisted = []
@ -269,31 +269,31 @@ def only_for(roles):
def clear_cache(user=None, doctype=None):
"""clear cache"""
import webnotes.sessions
import frappe.sessions
if doctype:
import webnotes.model.doctype
webnotes.model.doctype.clear_cache(doctype)
import frappe.model.doctype
frappe.model.doctype.clear_cache(doctype)
reset_metadata_version()
elif user:
webnotes.sessions.clear_cache(user)
frappe.sessions.clear_cache(user)
else: # everything
import translate
webnotes.sessions.clear_cache()
frappe.sessions.clear_cache()
translate.clear_cache()
reset_metadata_version()
def get_roles(username=None):
import webnotes.profile
import frappe.profile
if not local.session:
return ["Guest"]
elif not username or username==local.session.user:
return local.user.get_roles()
else:
return webnotes.profile.Profile(username).get_roles()
return frappe.profile.Profile(username).get_roles()
def has_permission(doctype, ptype="read", refdoc=None):
import webnotes.permissions
return webnotes.permissions.has_permission(doctype, ptype, refdoc)
import frappe.permissions
return frappe.permissions.has_permission(doctype, ptype, refdoc)
def clear_perms(doctype):
conn.sql("""delete from tabDocPerm where parent=%s""", doctype)
@ -314,70 +314,70 @@ def reset_metadata_version():
return v
def get_obj(dt = None, dn = None, doc=None, doclist=None, with_children = True):
from webnotes.model.code import get_obj
from frappe.model.code import get_obj
return get_obj(dt, dn, doc, doclist, with_children)
def doc(doctype=None, name=None, fielddata=None):
from webnotes.model.doc import Document
from frappe.model.doc import Document
return Document(doctype, name, fielddata)
def new_doc(doctype, parent_doc=None, parentfield=None):
from webnotes.model.create_new import get_new_doc
from frappe.model.create_new import get_new_doc
return get_new_doc(doctype, parent_doc, parentfield)
def new_bean(doctype):
from webnotes.model.create_new import get_new_doc
from frappe.model.create_new import get_new_doc
return bean([get_new_doc(doctype)])
def doclist(lst=None):
from webnotes.model.doclist import DocList
from frappe.model.doclist import DocList
return DocList(lst)
def bean(doctype=None, name=None, copy=None):
"""return an instance of the object, wrapped as a Bean (webnotes.model.bean)"""
from webnotes.model.bean import Bean
"""return an instance of the object, wrapped as a Bean (frappe.model.bean)"""
from frappe.model.bean import Bean
if copy:
return Bean(copy_doclist(copy))
else:
return Bean(doctype, name)
def set_value(doctype, docname, fieldname, value):
import webnotes.client
return webnotes.client.set_value(doctype, docname, fieldname, value)
import frappe.client
return frappe.client.set_value(doctype, docname, fieldname, value)
def get_doclist(doctype, name=None):
return bean(doctype, name).doclist
def get_doctype(doctype, processed=False):
import webnotes.model.doctype
return webnotes.model.doctype.get(doctype, processed)
import frappe.model.doctype
return frappe.model.doctype.get(doctype, processed)
def delete_doc(doctype=None, name=None, doclist = None, force=0, ignore_doctypes=None,
for_reload=False, ignore_permissions=False):
import webnotes.model.delete_doc
import frappe.model.delete_doc
if not ignore_doctypes:
ignore_doctypes = []
if isinstance(name, list):
for n in name:
webnotes.model.delete_doc.delete_doc(doctype, n, doclist, force, ignore_doctypes,
frappe.model.delete_doc.delete_doc(doctype, n, doclist, force, ignore_doctypes,
for_reload, ignore_permissions)
else:
webnotes.model.delete_doc.delete_doc(doctype, name, doclist, force, ignore_doctypes,
frappe.model.delete_doc.delete_doc(doctype, name, doclist, force, ignore_doctypes,
for_reload, ignore_permissions)
def reload_doc(module, dt=None, dn=None, force=False):
import webnotes.modules
return webnotes.modules.reload_doc(module, dt, dn, force=force)
import frappe.modules
return frappe.modules.reload_doc(module, dt, dn, force=force)
def rename_doc(doctype, old, new, debug=0, force=False, merge=False, ignore_permissions=False):
from webnotes.model.rename_doc import rename_doc
from frappe.model.rename_doc import rename_doc
return rename_doc(doctype, old, new, force=force, merge=merge, ignore_permissions=ignore_permissions)
def insert(doclist):
import webnotes.model
return webnotes.model.insert(doclist)
import frappe.model
return frappe.model.insert(doclist)
def get_module(modulename):
return importlib.import_module(modulename)
@ -399,11 +399,11 @@ def get_pymodule_path(modulename, *joins):
def get_module_list(app_name):
return get_file_items(os.path.join(os.path.dirname(get_module(app_name).__file__), "modules.txt"))
def get_all_apps(with_webnotes=False):
def get_all_apps(with_frappe=False):
apps = get_file_items(os.path.join(local.sites_path, "apps.txt")) \
+ get_file_items(os.path.join(local.site_path, "apps.txt"))
if with_webnotes:
apps.insert(0, 'webnotes')
if with_frappe:
apps.insert(0, 'frappe')
return apps
def get_installed_apps():
@ -532,8 +532,8 @@ def copy_doclist(in_doclist):
return doclist(new_doclist)
def compare(val1, condition, val2):
import webnotes.utils
return webnotes.utils.compare(val1, condition, val2)
import frappe.utils
return frappe.utils.compare(val1, condition, val2)
def repsond_as_web_page(title, html):
local.message_title = title
@ -544,29 +544,29 @@ def repsond_as_web_page(title, html):
return obj
def build_match_conditions(doctype, fields=None, as_condition=True):
import webnotes.widgets.reportview
return webnotes.widgets.reportview.build_match_conditions(doctype, fields, as_condition)
import frappe.widgets.reportview
return frappe.widgets.reportview.build_match_conditions(doctype, fields, as_condition)
def get_list(doctype, filters=None, fields=None, docstatus=None,
group_by=None, order_by=None, limit_start=0, limit_page_length=None,
as_list=False, debug=False):
import webnotes.widgets.reportview
return webnotes.widgets.reportview.execute(doctype, filters=filters, fields=fields, docstatus=docstatus,
import frappe.widgets.reportview
return frappe.widgets.reportview.execute(doctype, filters=filters, fields=fields, docstatus=docstatus,
group_by=group_by, order_by=order_by, limit_start=limit_start, limit_page_length=limit_page_length,
as_list=as_list, debug=debug)
def get_jenv():
if not local.jenv:
from jinja2 import Environment, DebugUndefined
import webnotes.utils
import frappe.utils
# webnotes will be loaded last, so app templates will get precedence
# frappe will be loaded last, so app templates will get precedence
jenv = Environment(loader = get_jloader(), undefined=DebugUndefined)
set_filters(jenv)
jenv.globals.update({
"webnotes": sys.modules[__name__],
"webnotes.utils": webnotes.utils,
"frappe": sys.modules[__name__],
"frappe.utils": frappe.utils,
"_": _
})
@ -579,16 +579,16 @@ def get_jloader():
from jinja2 import ChoiceLoader, PackageLoader
apps = get_installed_apps()
apps.remove("webnotes")
apps.remove("frappe")
local.jloader = ChoiceLoader([PackageLoader(app, ".") \
for app in apps + ["webnotes"]])
for app in apps + ["frappe"]])
return local.jloader
def set_filters(jenv):
from webnotes.utils import global_date_format
from webnotes.website.utils import get_hex_shade
from frappe.utils import global_date_format
from frappe.website.utils import get_hex_shade
from markdown2 import markdown
from json import dumps

97
frappe/api.py Normal file
View file

@ -0,0 +1,97 @@
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
# MIT License. See license.txt
import frappe
import frappe.handler
import frappe.client
import frappe.widgets.reportview
from frappe.utils.response import build_response, report_error
def handle():
"""
/api/method/{methodname} will call a whitelisted method
/api/resource/{doctype} will query a table
examples:
?fields=["name", "owner"]
?filters=[["Task", "name", "like", "%005"]]
?limit_start=0
?limit_page_length=20
/api/resource/{doctype}/{name} will point to a resource
GET will return doclist
POST will insert
PUT will update
DELETE will delete
/api/resource/{doctype}/{name}?run_method={method} will run a whitelisted controller method
"""
parts = frappe.request.path[1:].split("/")
call = doctype = name = None
if len(parts) > 1:
call = parts[1]
if len(parts) > 2:
doctype = parts[2]
if len(parts) > 3:
name = parts[3]
try:
if call=="method":
frappe.local.form_dict.cmd = doctype
frappe.handler.handle()
return
elif call=="resource":
if "run_method" in frappe.local.form_dict:
bean = frappe.bean(doctype, name)
if frappe.local.request.method=="GET":
if not bean.has_permission("read"):
frappe.throw("No Permission", frappe.PermissionError)
bean.run_method(frappe.local.form_dict.run_method, **frappe.local.form_dict)
if frappe.local.request.method=="POST":
if not bean.has_permission("write"):
frappe.throw("No Permission", frappe.PermissionError)
bean.run_method(frappe.local.form_dict.run_method, **frappe.local.form_dict)
frappe.conn.commit()
else:
if name:
if frappe.local.request.method=="GET":
frappe.local.response.update({
"doclist": frappe.client.get(doctype,
name)})
if frappe.local.request.method=="POST":
frappe.local.response.update({
"doclist": frappe.client.insert(frappe.local.form_dict.doclist)})
frappe.conn.commit()
if frappe.local.request.method=="PUT":
frappe.local.response.update({
"doclist":frappe.client.save(frappe.local.form_dict.doclist)})
frappe.conn.commit()
if frappe.local.request.method=="DELETE":
frappe.client.delete(doctype, name)
frappe.local.response.message = "ok"
elif doctype:
if frappe.local.request.method=="GET":
frappe.local.response.update({
"data": frappe.call(frappe.widgets.reportview.execute,
doctype, **frappe.local.form_dict)})
else:
raise frappe.DoesNotExistError
else:
raise frappe.DoesNotExistError
except frappe.DoesNotExistError, e:
report_error(404)
except Exception, e:
report_error(500)
build_response()

View file

@ -11,14 +11,14 @@ from werkzeug.exceptions import HTTPException, NotFound
from werkzeug.contrib.profiler import ProfilerMiddleware
import mimetypes
import webnotes
import webnotes.handler
import webnotes.auth
import webnotes.api
import webnotes.website.render
from webnotes.utils import get_site_name
import frappe
import frappe.handler
import frappe.auth
import frappe.api
import frappe.website.render
from frappe.utils import get_site_name
local_manager = LocalManager([webnotes.local])
local_manager = LocalManager([frappe.local])
_site = None
@ -37,45 +37,45 @@ def handle_session_stopped():
@Request.application
def application(request):
webnotes.local.request = request
frappe.local.request = request
try:
site = _site or get_site_name(request.host)
webnotes.init(site=site)
frappe.init(site=site)
if not webnotes.local.conf:
if not frappe.local.conf:
# site does not exist
raise NotFound
webnotes.local.form_dict = webnotes._dict({ k:v[0] if isinstance(v, (list, tuple)) else v \
frappe.local.form_dict = frappe._dict({ k:v[0] if isinstance(v, (list, tuple)) else v \
for k, v in (request.form or request.args).iteritems() })
webnotes.local._response = Response()
webnotes.http_request = webnotes.auth.HTTPRequest()
frappe.local._response = Response()
frappe.http_request = frappe.auth.HTTPRequest()
if webnotes.local.form_dict.cmd:
webnotes.handler.handle()
elif webnotes.request.path.startswith("/api/"):
webnotes.api.handle()
elif webnotes.local.request.method in ('GET', 'HEAD'):
webnotes.website.render.render(webnotes.request.path[1:])
if frappe.local.form_dict.cmd:
frappe.handler.handle()
elif frappe.request.path.startswith("/api/"):
frappe.api.handle()
elif frappe.local.request.method in ('GET', 'HEAD'):
frappe.website.render.render(frappe.request.path[1:])
else:
raise NotFound
except HTTPException, e:
return e
except webnotes.AuthenticationError, e:
webnotes._response.status_code=401
except frappe.AuthenticationError, e:
frappe._response.status_code=401
except webnotes.SessionStopped, e:
webnotes.local._response = handle_session_stopped()
except frappe.SessionStopped, e:
frappe.local._response = handle_session_stopped()
finally:
if webnotes.conn:
webnotes.conn.close()
if frappe.conn:
frappe.conn.close()
return webnotes.local._response
return frappe.local._response
application = local_manager.make_middleware(application)

262
frappe/auth.py Normal file
View file

@ -0,0 +1,262 @@
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
# MIT License. See license.txt
from __future__ import unicode_literals
import frappe
import frappe.db
import frappe.utils
import frappe.profile
from frappe import conf
from frappe.sessions import Session
class HTTPRequest:
def __init__(self):
# Get Environment variables
self.domain = frappe.request.host
if self.domain and self.domain.startswith('www.'):
self.domain = self.domain[4:]
# language
self.set_lang(frappe.get_request_header('HTTP_ACCEPT_LANGUAGE'))
# load cookies
frappe.local.cookie_manager = CookieManager()
# override request method. All request to be of type POST, but if _type == "POST" then commit
if frappe.form_dict.get("_type"):
frappe.local.request_method = frappe.form_dict.get("_type")
del frappe.form_dict["_type"]
# set db
self.connect()
# login
frappe.local.login_manager = LoginManager()
# check status
if frappe.conn.get_global("__session_status")=='stop':
frappe.msgprint(frappe.conn.get_global("__session_status_message"))
raise frappe.SessionStopped('Session Stopped')
# load profile
self.setup_profile()
# run login triggers
if frappe.form_dict.get('cmd')=='login':
frappe.local.login_manager.run_trigger('on_session_creation')
def set_lang(self, lang):
import translate
lang_list = translate.get_all_languages() or []
if not lang:
return
if ";" in lang: # not considering weightage
lang = lang.split(";")[0]
if "," in lang:
lang = lang.split(",")
else:
lang = [lang]
for l in lang:
code = l.strip()
if code in lang_list:
frappe.local.lang = code
return
# check if parent language (pt) is setup, if variant (pt-BR)
if "-" in code:
code = code.split("-")[0]
if code in lang_list:
frappe.local.lang = code
return
def setup_profile(self):
frappe.local.user = frappe.profile.Profile()
def get_db_name(self):
"""get database name from conf"""
return conf.db_name
def connect(self, ac_name = None):
"""connect to db, from ac_name or db_name"""
frappe.local.conn = frappe.db.Database(user = self.get_db_name(), \
password = getattr(conf,'db_password', ''))
class LoginManager:
def __init__(self):
self.user = None
if frappe.local.form_dict.get('cmd')=='login' or frappe.local.request.path=="/api/method/login":
self.login()
else:
self.make_session(resume=True)
def login(self):
# clear cache
frappe.clear_cache(user = frappe.form_dict.get('usr'))
self.authenticate()
self.post_login()
def post_login(self):
self.run_trigger('on_login')
self.validate_ip_address()
self.validate_hour()
self.make_session()
self.set_user_info()
def set_user_info(self):
info = frappe.conn.get_value("Profile", self.user,
["user_type", "first_name", "last_name", "user_image"], as_dict=1)
if info.user_type=="Website User":
frappe.local._response.set_cookie("system_user", "no")
frappe.local.response["message"] = "No App"
else:
frappe.local._response.set_cookie("system_user", "yes")
frappe.local.response['message'] = 'Logged In'
full_name = " ".join(filter(None, [info.first_name, info.last_name]))
frappe.response["full_name"] = full_name
frappe._response.set_cookie("full_name", full_name)
frappe._response.set_cookie("user_id", self.user)
frappe._response.set_cookie("user_image", info.user_image or "")
def make_session(self, resume=False):
# start session
frappe.local.session_obj = Session(user=self.user, resume=resume)
# reset user if changed to Guest
self.user = frappe.local.session_obj.user
frappe.local.session = frappe.local.session_obj.data
def authenticate(self, user=None, pwd=None):
if not (user and pwd):
user, pwd = frappe.form_dict.get('usr'), frappe.form_dict.get('pwd')
if not (user and pwd):
self.fail('Incomplete login details')
self.check_if_enabled(user)
self.user = self.check_password(user, pwd)
def check_if_enabled(self, user):
"""raise exception if user not enabled"""
from frappe.utils import cint
if user=='Administrator': return
if not cint(frappe.conn.get_value('Profile', user, 'enabled')):
self.fail('User disabled or missing')
def check_password(self, user, pwd):
"""check password"""
user = frappe.conn.sql("""select `user` from __Auth where `user`=%s
and `password`=password(%s)""", (user, pwd))
if not user:
self.fail('Incorrect password')
else:
return user[0][0] # in correct case
def fail(self, message):
frappe.local.response['message'] = message
raise frappe.AuthenticationError
def run_trigger(self, method='on_login'):
for method in frappe.get_hooks().get("method", []):
frappe.get_attr(method)(self)
def validate_ip_address(self):
"""check if IP Address is valid"""
ip_list = frappe.conn.get_value('Profile', self.user, 'restrict_ip', ignore=True)
if not ip_list:
return
ip_list = ip_list.replace(",", "\n").split('\n')
ip_list = [i.strip() for i in ip_list]
for ip in ip_list:
if frappe.get_request_header('REMOTE_ADDR', '').startswith(ip) or frappe.get_request_header('X-Forwarded-For', '').startswith(ip):
return
frappe.msgprint('Not allowed from this IP Address')
raise frappe.AuthenticationError
def validate_hour(self):
"""check if user is logging in during restricted hours"""
login_before = int(frappe.conn.get_value('Profile', self.user, 'login_before', ignore=True) or 0)
login_after = int(frappe.conn.get_value('Profile', self.user, 'login_after', ignore=True) or 0)
if not (login_before or login_after):
return
from frappe.utils import now_datetime
current_hour = int(now_datetime().strftime('%H'))
if login_before and current_hour > login_before:
frappe.msgprint('Not allowed to login after restricted hour', raise_exception=1)
if login_after and current_hour < login_after:
frappe.msgprint('Not allowed to login before restricted hour', raise_exception=1)
def login_as_guest(self):
"""login as guest"""
self.user = 'Guest'
self.post_login()
def logout(self, arg='', user=None):
if not user: user = frappe.session.user
self.run_trigger('on_logout')
if user in ['demo@erpnext.com', 'Administrator']:
frappe.conn.sql('delete from tabSessions where sid=%s', frappe.session.get('sid'))
frappe.cache().delete_value("session:" + frappe.session.get("sid"))
else:
from frappe.sessions import clear_sessions
clear_sessions(user)
if user == frappe.session.user:
frappe.session.sid = ""
frappe.local._response.delete_cookie("full_name")
frappe.local._response.delete_cookie("user_id")
frappe.local._response.delete_cookie("sid")
frappe.local._response.set_cookie("full_name", "")
frappe.local._response.set_cookie("user_id", "")
frappe.local._response.set_cookie("sid", "")
class CookieManager:
def __init__(self):
pass
def set_cookies(self):
if not frappe.local.session.get('sid'): return
import datetime
# sid expires in 3 days
expires = datetime.datetime.now() + datetime.timedelta(days=3)
if frappe.session.sid:
frappe.local._response.set_cookie("sid", frappe.session.sid, expires = expires)
if frappe.session.session_country:
frappe.local._response.set_cookie('country', frappe.session.get("session_country"))
def set_remember_me(self):
from frappe.utils import cint
if not cint(frappe.form_dict.get('remember_me')): return
remember_days = frappe.conn.get_value('Control Panel', None,
'remember_for_days') or 7
import datetime
expires = datetime.datetime.now() + \
datetime.timedelta(days=remember_days)
frappe.local._response.set_cookie["remember_me"] = 1
def _update_password(user, password):
frappe.conn.sql("""insert into __Auth (user, `password`)
values (%s, password(%s))
on duplicate key update `password`=password(%s)""", (user,
password, password))
@frappe.whitelist()
def get_logged_user():
return frappe.session.user

139
frappe/boot.py Normal file
View file

@ -0,0 +1,139 @@
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
# MIT License. See license.txt
from __future__ import unicode_literals
"""
bootstrap client session
"""
import frappe
import frappe.defaults
import frappe.model.doc
import frappe.widgets.page
import json
def get_bootinfo():
"""build and return boot info"""
bootinfo = frappe._dict()
hooks = frappe.get_hooks()
doclist = []
# profile
get_profile(bootinfo)
# control panel
cp = frappe.model.doc.getsingle('Control Panel')
# system info
bootinfo['control_panel'] = frappe._dict(cp.copy())
bootinfo['sysdefaults'] = frappe.defaults.get_defaults()
bootinfo['server_date'] = frappe.utils.nowdate()
bootinfo["send_print_in_body_and_attachment"] = frappe.conn.get_value("Email Settings",
None, "send_print_in_body_and_attachment")
if frappe.session['user'] != 'Guest':
bootinfo['user_info'] = get_fullnames()
bootinfo['sid'] = frappe.session['sid'];
# home page
bootinfo.modules = {}
for app in frappe.get_installed_apps():
try:
bootinfo.modules.update(frappe.get_attr(app + ".config.desktop.data") or {})
except ImportError, e:
pass
bootinfo.hidden_modules = frappe.conn.get_global("hidden_modules")
bootinfo.doctype_icons = dict(frappe.conn.sql("""select name, icon from
tabDocType where ifnull(icon,'')!=''"""))
bootinfo.doctype_icons.update(dict(frappe.conn.sql("""select name, icon from
tabPage where ifnull(icon,'')!=''""")))
add_home_page(bootinfo, doclist)
add_allowed_pages(bootinfo)
load_translations(bootinfo)
load_conf_settings(bootinfo)
load_startup_js(bootinfo)
# ipinfo
if frappe.session['data'].get('ipinfo'):
bootinfo['ipinfo'] = frappe.session['data']['ipinfo']
# add docs
bootinfo['docs'] = doclist
for method in hooks.boot_session or []:
frappe.get_attr(method)(bootinfo)
from frappe.model.utils import compress
bootinfo['docs'] = compress(bootinfo['docs'])
if bootinfo.lang:
bootinfo.lang = unicode(bootinfo.lang)
bootinfo.metadata_version = frappe.cache().get_value("metadata_version")
if not bootinfo.metadata_version:
bootinfo.metadata_version = frappe.reset_metadata_version()
return bootinfo
def load_conf_settings(bootinfo):
from frappe import conf
for key in ['developer_mode']:
if key in conf: bootinfo[key] = conf.get(key)
def add_allowed_pages(bootinfo):
bootinfo.page_info = dict(frappe.conn.sql("""select distinct parent, modified from `tabPage Role`
where role in ('%s')""" % "', '".join(frappe.get_roles())))
def load_translations(bootinfo):
frappe.set_user_lang(frappe.session.user)
if frappe.lang != 'en':
bootinfo["__messages"] = frappe.get_lang_dict("include")
bootinfo["lang"] = frappe.lang
def get_fullnames():
"""map of user fullnames"""
ret = frappe.conn.sql("""select name,
concat(ifnull(first_name, ''),
if(ifnull(last_name, '')!='', ' ', ''), ifnull(last_name, '')),
user_image, gender, email
from tabProfile where ifnull(enabled, 0)=1""", as_list=1)
d = {}
for r in ret:
if not r[2]:
r[2] = '/assets/frappe/images/ui/avatar.png'
else:
r[2] = r[2]
d[r[0]]= {'fullname': r[1], 'image': r[2], 'gender': r[3],
'email': r[4] or r[0]}
return d
def load_startup_js(bootinfo):
bootinfo.startup_js = ""
for method in frappe.get_hooks().startup_js or []:
bootinfo.startup_js += frappe.get_attr(method)()
def get_profile(bootinfo):
"""get profile info"""
bootinfo['profile'] = frappe.user.load_profile()
def add_home_page(bootinfo, doclist):
"""load home page"""
if frappe.session.user=="Guest":
return
home_page = frappe.get_application_home_page(frappe.session.user)
try:
page_doclist = frappe.widgets.page.get(home_page)
except (frappe.DoesNotExistError, frappe.PermissionError), e:
page_doclist = frappe.widgets.page.get('desktop')
bootinfo['home_page_html'] = page_doclist[0].content
bootinfo['home_page'] = page_doclist[0].name
doclist += page_doclist

View file

@ -2,22 +2,22 @@
# MIT License. See license.txt
from __future__ import unicode_literals
from webnotes.utils.minify import JavascriptMinify
from frappe.utils.minify import JavascriptMinify
"""
Build the `public` folders and setup languages
"""
import os, sys, webnotes, json, shutil
import os, sys, frappe, json, shutil
from cssmin import cssmin
import webnotes.translate
import frappe.translate
def bundle(no_compress):
"""concat / minify js files"""
# build js files
make_asset_dirs()
build(no_compress)
webnotes.translate.clear_cache()
frappe.translate.clear_cache()
def watch(no_compress):
"""watch and rebuild if necessary"""
@ -31,8 +31,8 @@ def watch(no_compress):
time.sleep(3)
def make_asset_dirs():
assets_path = os.path.join(webnotes.local.sites_path, "assets")
site_public_path = os.path.join(webnotes.local.site_path, 'public')
assets_path = os.path.join(frappe.local.sites_path, "assets")
site_public_path = os.path.join(frappe.local.site_path, 'public')
for dir_path in [
os.path.join(assets_path, 'js'),
os.path.join(assets_path, 'css')]:
@ -41,8 +41,8 @@ def make_asset_dirs():
os.makedirs(dir_path)
# symlink app/public > assets/app
for app_name in webnotes.get_all_apps(True):
pymodule = webnotes.get_module(app_name)
for app_name in frappe.get_all_apps(True):
pymodule = frappe.get_module(app_name)
source = os.path.join(os.path.abspath(os.path.dirname(pymodule.__file__)), 'public')
target = os.path.join(assets_path, app_name)
@ -50,18 +50,18 @@ def make_asset_dirs():
os.symlink(os.path.abspath(source), target)
def build(no_compress=False):
assets_path = os.path.join(webnotes.local.sites_path, "assets")
assets_path = os.path.join(frappe.local.sites_path, "assets")
for target, sources in get_build_maps().iteritems():
pack(os.path.join(assets_path, target), sources, no_compress)
shutil.copy(os.path.join(os.path.dirname(os.path.abspath(webnotes.__file__)), 'data', 'languages.txt'), webnotes.local.sites_path)
shutil.copy(os.path.join(os.path.dirname(os.path.abspath(frappe.__file__)), 'data', 'languages.txt'), frappe.local.sites_path)
# reset_app_html()
def get_build_maps():
"""get all build.jsons with absolute paths"""
# framework js and css files
pymodules = [webnotes.get_module(app) for app in webnotes.get_all_apps(True)]
pymodules = [frappe.get_module(app) for app in frappe.get_all_apps(True)]
app_paths = [os.path.dirname(pymodule.__file__) for pymodule in pymodules]
build_maps = {}
@ -75,7 +75,7 @@ def get_build_maps():
source_paths = []
for source in sources:
if isinstance(source, list):
s = webnotes.get_pymodule_path(source[0], *source[1].split("/"))
s = frappe.get_pymodule_path(source[0], *source[1].split("/"))
else:
s = os.path.join(app_path, source)
source_paths.append(s)
@ -114,7 +114,7 @@ def pack(target, sources, no_compress):
except Exception, e:
print "--Error in:" + f + "--"
print webnotes.get_traceback()
print frappe.get_traceback()
if not no_compress and outtype == 'css':
pass

View file

@ -6,12 +6,12 @@
from __future__ import unicode_literals
import sys, os
import webnotes
import frappe
site_arg_optional = []
def main():
parsed_args = webnotes._dict(vars(setup_parser()))
parsed_args = frappe._dict(vars(setup_parser()))
fn = get_function(parsed_args)
if not parsed_args.get("sites_path"):
parsed_args["sites_path"] = "."
@ -22,7 +22,7 @@ def main():
for site in get_sites(parsed_args["sites_path"]):
args = parsed_args.copy()
args["site"] = site
webnotes.init(site)
frappe.init(site)
run(fn, args)
else:
if not fn in site_arg_optional:
@ -40,7 +40,7 @@ def main():
print "Did not find folder '{}'. Are you in sites folder?".format(parsed_args.get("site"))
exit(1)
webnotes.init(site)
frappe.init(site)
run(fn, parsed_args)
else:
run(fn, parsed_args)
@ -84,7 +84,7 @@ def get_sites(sites_path=None):
def setup_parser():
import argparse
parser = argparse.ArgumentParser(description="Run webnotes utility functions")
parser = argparse.ArgumentParser(description="Run frappe utility functions")
setup_install(parser)
setup_utilities(parser)
@ -228,35 +228,35 @@ def setup_translation(parser):
# methods
@cmd
def make_app():
from webnotes.utils.boilerplate import make_boilerplate
from frappe.utils.boilerplate import make_boilerplate
make_boilerplate()
@cmd
def use():
with open("currentsite.txt", "w") as sitefile:
sitefile.write(webnotes.local.site)
sitefile.write(frappe.local.site)
# install
@cmd
def install(db_name, root_login="root", root_password=None, source_sql=None,
admin_password = 'admin', verbose=True, force=False, site_config=None, reinstall=False):
from webnotes.installer import install_db, install_app, make_site_dirs
from frappe.installer import install_db, install_app, make_site_dirs
install_db(root_login=root_login, root_password=root_password, db_name=db_name, source_sql=source_sql,
admin_password = admin_password, verbose=verbose, force=force, site_config=site_config, reinstall=reinstall)
make_site_dirs()
install_app("webnotes", verbose=verbose)
webnotes.destroy()
install_app("frappe", verbose=verbose)
frappe.destroy()
@cmd
def install_app(app_name, verbose=False):
from webnotes.installer import install_app
webnotes.connect()
from frappe.installer import install_app
frappe.connect()
install_app(app_name, verbose=verbose)
webnotes.destroy()
frappe.destroy()
@cmd
def reinstall(verbose=True):
install(db_name=webnotes.conf.db_name, verbose=verbose, force=True, reinstall=True)
install(db_name=frappe.conf.db_name, verbose=verbose, force=True, reinstall=True)
@cmd
def restore(db_name, source_sql, verbose=True, force=False):
@ -264,16 +264,16 @@ def restore(db_name, source_sql, verbose=True, force=False):
@cmd
def install_fixtures():
from webnotes.install_lib.install import install_fixtures
from frappe.install_lib.install import install_fixtures
install_fixtures()
webnotes.destroy()
frappe.destroy()
@cmd
def add_system_manager(email, first_name=None, last_name=None):
webnotes.connect()
webnotes.profile.add_system_manager(email, first_name, last_name)
webnotes.conn.commit()
webnotes.destroy()
frappe.connect()
frappe.profile.add_system_manager(email, first_name, last_name)
frappe.conn.commit()
frappe.destroy()
# utilities
@ -282,7 +282,7 @@ def update(remote=None, branch=None, reload_gunicorn=False):
pull(remote=remote, branch=branch)
# maybe there are new framework changes, any consequences?
reload(webnotes)
reload(frappe)
build()
latest()
if reload_gunicorn:
@ -291,88 +291,88 @@ def update(remote=None, branch=None, reload_gunicorn=False):
@cmd
def latest(verbose=True):
import webnotes.modules.patch_handler
import webnotes.model.sync
from webnotes.website import rebuild_config
import frappe.modules.patch_handler
import frappe.model.sync
from frappe.website import rebuild_config
webnotes.connect()
frappe.connect()
try:
# run patches
webnotes.local.patch_log_list = []
webnotes.modules.patch_handler.run_all()
frappe.local.patch_log_list = []
frappe.modules.patch_handler.run_all()
if verbose:
print "\n".join(webnotes.local.patch_log_list)
print "\n".join(frappe.local.patch_log_list)
# sync
webnotes.model.sync.sync_all()
frappe.model.sync.sync_all()
# build website config if any changes in templates etc.
rebuild_config()
except webnotes.modules.patch_handler.PatchError, e:
print "\n".join(webnotes.local.patch_log_list)
except frappe.modules.patch_handler.PatchError, e:
print "\n".join(frappe.local.patch_log_list)
raise
finally:
webnotes.destroy()
frappe.destroy()
@cmd
def sync_all(force=False):
import webnotes.model.sync
webnotes.connect()
webnotes.model.sync.sync_all(force=force)
webnotes.destroy()
import frappe.model.sync
frappe.connect()
frappe.model.sync.sync_all(force=force)
frappe.destroy()
@cmd
def patch(patch_module, force=False):
import webnotes.modules.patch_handler
webnotes.connect()
webnotes.local.patch_log_list = []
webnotes.modules.patch_handler.run_single(patch_module, force=force)
print "\n".join(webnotes.local.patch_log_list)
webnotes.destroy()
import frappe.modules.patch_handler
frappe.connect()
frappe.local.patch_log_list = []
frappe.modules.patch_handler.run_single(patch_module, force=force)
print "\n".join(frappe.local.patch_log_list)
frappe.destroy()
@cmd
def update_all_sites(remote=None, branch=None, verbose=True):
pull(remote, branch)
# maybe there are new framework changes, any consequences?
reload(webnotes)
reload(frappe)
build()
for site in get_sites():
webnotes.init(site)
frappe.init(site)
latest(verbose=verbose)
@cmd
def reload_doc(module, doctype, docname, force=False):
webnotes.connect()
webnotes.reload_doc(module, doctype, docname, force=force)
webnotes.conn.commit()
webnotes.destroy()
frappe.connect()
frappe.reload_doc(module, doctype, docname, force=force)
frappe.conn.commit()
frappe.destroy()
@cmd
def build():
import webnotes.build
import webnotes
webnotes.build.bundle(False)
import frappe.build
import frappe
frappe.build.bundle(False)
@cmd
def watch():
import webnotes.build
webnotes.build.watch(True)
import frappe.build
frappe.build.watch(True)
@cmd
def backup(with_files=False, verbose=True, backup_path_db=None, backup_path_files=None):
from webnotes.utils.backups import scheduled_backup
webnotes.connect()
from frappe.utils.backups import scheduled_backup
frappe.connect()
odb = scheduled_backup(ignore_files=not with_files, backup_path_db=backup_path_db, backup_path_files=backup_path_files)
if verbose:
from webnotes.utils import now
from frappe.utils import now
print "database backup taken -", odb.backup_path_db, "- on", now()
if with_files:
print "files backup taken -", odb.backup_path_files, "- on", now()
webnotes.destroy()
frappe.destroy()
return odb
@cmd
@ -383,7 +383,7 @@ def move(dest_dir=None):
if not os.path.isdir(dest_dir):
raise Exception, "destination is not a directory or does not exist"
old_path = webnotes.utils.get_site()
old_path = frappe.utils.get_site()
new_path = os.path.join(dest_dir, site)
# check if site dump of same name already exists
@ -395,87 +395,87 @@ def move(dest_dir=None):
count = int(count or 0) + 1
os.rename(old_path, final_new_path)
webnotes.destroy()
frappe.destroy()
return os.path.basename(final_new_path)
@cmd
def domain(host_url=None):
webnotes.connect()
frappe.connect()
if host_url:
webnotes.conn.set_value("Website Settings", None, "subdomain", host_url)
webnotes.conn.commit()
frappe.conn.set_value("Website Settings", None, "subdomain", host_url)
frappe.conn.commit()
else:
print webnotes.conn.get_value("Website Settings", None, "subdomain")
webnotes.destroy()
print frappe.conn.get_value("Website Settings", None, "subdomain")
frappe.destroy()
@cmd
def make_conf(db_name=None, db_password=None, site_config=None):
from webnotes.install_lib.install import make_conf
from frappe.install_lib.install import make_conf
make_conf(db_name=db_name, db_password=db_password, site_config=site_config)
@cmd
def make_custom_server_script(doctype):
from webnotes.core.doctype.custom_script.custom_script import make_custom_server_script_file
webnotes.connect()
from frappe.core.doctype.custom_script.custom_script import make_custom_server_script_file
frappe.connect()
make_custom_server_script_file(doctype)
webnotes.destroy()
frappe.destroy()
# clear
@cmd
def clear_cache():
import webnotes.sessions
webnotes.connect()
webnotes.clear_cache()
webnotes.destroy()
import frappe.sessions
frappe.connect()
frappe.clear_cache()
frappe.destroy()
@cmd
def clear_web():
import webnotes.website.render
webnotes.connect()
webnotes.website.render.clear_cache()
webnotes.destroy()
import frappe.website.render
frappe.connect()
frappe.website.render.clear_cache()
frappe.destroy()
@cmd
def build_sitemap():
from webnotes.website import rebuild_config
webnotes.connect()
from frappe.website import rebuild_config
frappe.connect()
rebuild_config()
webnotes.destroy()
frappe.destroy()
@cmd
def sync_statics():
from webnotes.website.doctype.web_page import web_page
webnotes.connect()
from frappe.website.doctype.web_page import web_page
frappe.connect()
web_page.sync_statics()
webnotes.conn.commit()
webnotes.destroy()
frappe.conn.commit()
frappe.destroy()
@cmd
def reset_perms():
webnotes.connect()
for d in webnotes.conn.sql_list("""select name from `tabDocType`
frappe.connect()
for d in frappe.conn.sql_list("""select name from `tabDocType`
where ifnull(istable, 0)=0 and ifnull(custom, 0)=0"""):
webnotes.clear_cache(doctype=d)
webnotes.reset_perms(d)
webnotes.destroy()
frappe.clear_cache(doctype=d)
frappe.reset_perms(d)
frappe.destroy()
# scheduler
@cmd
def run_scheduler():
from webnotes.utils.file_lock import create_lock, delete_lock
import webnotes.utils.scheduler
from frappe.utils.file_lock import create_lock, delete_lock
import frappe.utils.scheduler
if create_lock('scheduler'):
webnotes.connect()
print webnotes.utils.scheduler.execute()
frappe.connect()
print frappe.utils.scheduler.execute()
delete_lock('scheduler')
webnotes.destroy()
frappe.destroy()
@cmd
def run_scheduler_event(event):
import webnotes.utils.scheduler
webnotes.connect()
print webnotes.utils.scheduler.trigger(event)
webnotes.destroy()
import frappe.utils.scheduler
frappe.connect()
print frappe.utils.scheduler.trigger(event)
frappe.destroy()
# replace
@cmd
@ -486,53 +486,53 @@ def replace(search_regex, replacement, extn, force=False):
# import/export
@cmd
def export_doc(doctype, docname):
import webnotes.modules
webnotes.connect()
webnotes.modules.export_doc(doctype, docname)
webnotes.destroy()
import frappe.modules
frappe.connect()
frappe.modules.export_doc(doctype, docname)
frappe.destroy()
@cmd
def export_doclist(doctype, name, path):
from webnotes.core.page.data_import_tool import data_import_tool
webnotes.connect()
from frappe.core.page.data_import_tool import data_import_tool
frappe.connect()
data_import_tool.export_json(doctype, name, path)
webnotes.destroy()
frappe.destroy()
@cmd
def export_csv(doctype, path):
from webnotes.core.page.data_import_tool import data_import_tool
webnotes.connect()
from frappe.core.page.data_import_tool import data_import_tool
frappe.connect()
data_import_tool.export_csv(doctype, path)
webnotes.destroy()
frappe.destroy()
@cmd
def import_doclist(path, force=False):
from webnotes.core.page.data_import_tool import data_import_tool
webnotes.connect()
from frappe.core.page.data_import_tool import data_import_tool
frappe.connect()
data_import_tool.import_doclist(path, overwrite=force)
webnotes.destroy()
frappe.destroy()
# translation
@cmd
def build_message_files():
import webnotes.translate
webnotes.connect()
webnotes.translate.rebuild_all_translation_files()
webnotes.destroy()
import frappe.translate
frappe.connect()
frappe.translate.rebuild_all_translation_files()
frappe.destroy()
@cmd
def get_untranslated(lang, untranslated_file):
import webnotes.translate
webnotes.connect()
webnotes.translate.get_untranslated(lang, untranslated_file)
webnotes.destroy()
import frappe.translate
frappe.connect()
frappe.translate.get_untranslated(lang, untranslated_file)
frappe.destroy()
@cmd
def update_translations(lang, untranslated_file, translated_file):
import webnotes.translate
webnotes.connect()
webnotes.translate.update_translations(lang, untranslated_file, translated_file)
webnotes.destroy()
import frappe.translate
frappe.connect()
frappe.translate.update_translations(lang, untranslated_file, translated_file)
frappe.destroy()
# git
@cmd
@ -545,12 +545,12 @@ def git(param):
def get_remote_and_branch(remote=None, branch=None):
if not (remote and branch):
if not webnotes.conf.branch:
if not frappe.conf.branch:
raise Exception("Please specify remote and branch")
remote = remote or "origin"
branch = branch or webnotes.conf.branch
webnotes.destroy()
branch = branch or frappe.conf.branch
frappe.destroy()
return remote, branch
@ -578,36 +578,36 @@ def checkout(branch):
@cmd
def set_admin_password(admin_password):
import webnotes
webnotes.connect()
webnotes.conn.sql("""update __Auth set `password`=password(%s)
import frappe
frappe.connect()
frappe.conn.sql("""update __Auth set `password`=password(%s)
where user='Administrator'""", (admin_password,))
webnotes.conn.commit()
webnotes.destroy()
frappe.conn.commit()
frappe.destroy()
@cmd
def mysql():
import webnotes
import frappe
import commands, os
msq = commands.getoutput('which mysql')
os.execv(msq, [msq, '-u', webnotes.conf.db_name, '-p'+webnotes.conf.db_password, webnotes.conf.db_name, '-h', webnotes.conf.db_host or "localhost", "-A"])
webnotes.destroy()
os.execv(msq, [msq, '-u', frappe.conf.db_name, '-p'+frappe.conf.db_password, frappe.conf.db_name, '-h', frappe.conf.db_host or "localhost", "-A"])
frappe.destroy()
@cmd
def python(site):
import webnotes
import frappe
import commands, os
python = commands.getoutput('which python')
if site:
os.environ["site"] = site
os.environ["PYTHONSTARTUP"] = os.path.join(os.path.dirname(webnotes.__file__), "pythonrc.py")
os.environ["PYTHONSTARTUP"] = os.path.join(os.path.dirname(frappe.__file__), "pythonrc.py")
os.execv(python, [python])
webnotes.destroy()
frappe.destroy()
@cmd
def ipython():
import webnotes
webnotes.connect()
import frappe
frappe.connect()
import IPython
IPython.embed()
@ -619,44 +619,44 @@ def smtp_debug_server():
@cmd
def run_tests(app=None, module=None, doctype=None, verbose=False):
import webnotes.test_runner
ret = webnotes.test_runner.main(app and app[0], module and module[0], doctype and doctype[0], verbose)
import frappe.test_runner
ret = frappe.test_runner.main(app and app[0], module and module[0], doctype and doctype[0], verbose)
if len(ret.failures) > 0 or len(ret.errors) > 0:
exit(1)
@cmd
def serve(port=8000, profile=False):
import webnotes.app
webnotes.app.serve(port=port, profile=profile, site=webnotes.local.site)
import frappe.app
frappe.app.serve(port=port, profile=profile, site=frappe.local.site)
@cmd
def request(args):
import webnotes.handler
import webnotes.api
webnotes.connect()
import frappe.handler
import frappe.api
frappe.connect()
if "?" in args:
webnotes.local.form_dict = webnotes._dict([a.split("=") for a in args.split("?")[-1].split("&")])
frappe.local.form_dict = frappe._dict([a.split("=") for a in args.split("?")[-1].split("&")])
else:
webnotes.local.form_dict = webnotes._dict()
frappe.local.form_dict = frappe._dict()
if args.startswith("/api/method"):
webnotes.local.form_dict.cmd = args.split("?")[0].split("/")[-1]
frappe.local.form_dict.cmd = args.split("?")[0].split("/")[-1]
webnotes.handler.execute_cmd(webnotes.form_dict.cmd)
frappe.handler.execute_cmd(frappe.form_dict.cmd)
print webnotes.response
webnotes.destroy()
print frappe.response
frappe.destroy()
@cmd
def flush_memcache():
webnotes.cache().flush_all()
frappe.cache().flush_all()
def replace_code(start, txt1, txt2, extn, search=None, force=False):
"""replace all txt1 by txt2 in files with extension (extn)"""
import webnotes.utils
import frappe.utils
import os, re
esc = webnotes.utils.make_esc('[]')
esc = frappe.utils.make_esc('[]')
if not search: search = esc(txt1)
for wt in os.walk(start, followlinks=1):
for fn in wt[2]:
@ -700,28 +700,28 @@ def search_replace_with_prompt(fpath, txt1, txt2, force=False):
@cmd
def get_site_status(verbose=False):
import webnotes
import webnotes.utils
from webnotes.profile import get_system_managers
from webnotes.core.doctype.profile.profile import get_total_users, get_active_users, \
import frappe
import frappe.utils
from frappe.profile import get_system_managers
from frappe.core.doctype.profile.profile import get_total_users, get_active_users, \
get_website_users, get_active_website_users
import json
webnotes.connect()
frappe.connect()
ret = {
'last_backup_on': webnotes.local.conf.last_backup_on,
'last_backup_on': frappe.local.conf.last_backup_on,
'active_users': get_active_users(),
'total_users': get_total_users(),
'active_website_users': get_active_website_users(),
'website_users': get_website_users(),
'system_managers': "\n".join(get_system_managers()),
'default_company': webnotes.conn.get_default("company"),
'disk_usage': webnotes.utils.get_disk_usage(),
'working_directory': webnotes.local.site_path
'default_company': frappe.conn.get_default("company"),
'disk_usage': frappe.utils.get_disk_usage(),
'working_directory': frappe.local.site_path
}
# country, timezone, industry
control_panel_details = webnotes.conn.get_value("Control Panel", "Control Panel",
control_panel_details = frappe.conn.get_value("Control Panel", "Control Panel",
["country", "time_zone", "industry"], as_dict=True)
if control_panel_details:
ret.update(control_panel_details)
@ -730,9 +730,9 @@ def get_site_status(verbose=False):
for doctype in ("Company", "Customer", "Item", "Quotation", "Sales Invoice",
"Journal Voucher", "Stock Ledger Entry"):
key = doctype.lower().replace(" ", "_") + "_exists"
ret[key] = 1 if webnotes.conn.count(doctype) else 0
ret[key] = 1 if frappe.conn.count(doctype) else 0
webnotes.destroy()
frappe.destroy()
if verbose:
print json.dumps(ret, indent=1, sort_keys=True)
@ -746,14 +746,14 @@ def update_site_config(site_config, verbose=False):
if isinstance(site_config, basestring):
site_config = json.loads(site_config)
config = webnotes.get_site_config()
config = frappe.get_site_config()
config.update(site_config)
site_config_path = os.path.join(webnotes.local.site_path, "site_config.json")
site_config_path = os.path.join(frappe.local.site_path, "site_config.json")
with open(site_config_path, "w") as f:
json.dump(config, f, indent=1, sort_keys=True)
webnotes.destroy()
frappe.destroy()
@cmd
def bump(repo, bump_type):

View file

@ -2,48 +2,48 @@
# MIT License. See license.txt
from __future__ import unicode_literals
import webnotes
from webnotes import _
import webnotes.model
import webnotes.utils
import frappe
from frappe import _
import frappe.model
import frappe.utils
import json, os
@webnotes.whitelist()
@frappe.whitelist()
def get(doctype, name=None, filters=None):
if filters and not name:
name = webnotes.conn.get_value(doctype, json.loads(filters))
name = frappe.conn.get_value(doctype, json.loads(filters))
if not name:
raise Exception, "No document found for given filters"
return [d.fields for d in webnotes.bean(doctype, name).doclist]
return [d.fields for d in frappe.bean(doctype, name).doclist]
@webnotes.whitelist()
@frappe.whitelist()
def get_value(doctype, fieldname, filters=None, as_dict=True, debug=False):
if not webnotes.has_permission(doctype):
webnotes.msgprint("No Permission", raise_exception=True)
if not frappe.has_permission(doctype):
frappe.msgprint("No Permission", raise_exception=True)
if fieldname and fieldname.startswith("["):
fieldname = json.loads(fieldname)
return webnotes.conn.get_value(doctype, json.loads(filters), fieldname, as_dict=as_dict, debug=debug)
return frappe.conn.get_value(doctype, json.loads(filters), fieldname, as_dict=as_dict, debug=debug)
@webnotes.whitelist()
@frappe.whitelist()
def set_value(doctype, name, fieldname, value):
if fieldname in webnotes.model.default_fields:
webnotes.throw(_("Cannot edit standard fields"))
if fieldname in frappe.model.default_fields:
frappe.throw(_("Cannot edit standard fields"))
doc = webnotes.conn.get_value(doctype, name, ["parenttype", "parent"], as_dict=True)
doc = frappe.conn.get_value(doctype, name, ["parenttype", "parent"], as_dict=True)
if doc and doc.parent:
bean = webnotes.bean(doc.parenttype, doc.parent)
bean = frappe.bean(doc.parenttype, doc.parent)
child = bean.doclist.getone({"doctype": doctype, "name": name})
child.fields[fieldname] = value
else:
bean = webnotes.bean(doctype, name)
bean = frappe.bean(doctype, name)
bean.doc.fields[fieldname] = value
bean.save()
return [d.fields for d in bean.doclist]
@webnotes.whitelist()
@frappe.whitelist()
def insert(doclist):
if isinstance(doclist, basestring):
doclist = json.loads(doclist)
@ -51,57 +51,57 @@ def insert(doclist):
doclist[0]["__islocal"] = 1
return save(doclist)
@webnotes.whitelist()
@frappe.whitelist()
def save(doclist):
if isinstance(doclist, basestring):
doclist = json.loads(doclist)
doclistobj = webnotes.bean(doclist)
doclistobj = frappe.bean(doclist)
doclistobj.save()
return [d.fields for d in doclist]
@webnotes.whitelist()
@frappe.whitelist()
def rename_doc(doctype, old_name, new_name, merge=False):
new_name = webnotes.rename_doc(doctype, old_name, new_name, merge=merge)
new_name = frappe.rename_doc(doctype, old_name, new_name, merge=merge)
return new_name
@webnotes.whitelist()
@frappe.whitelist()
def submit(doclist):
if isinstance(doclist, basestring):
doclist = json.loads(doclist)
doclistobj = webnotes.bean(doclist)
doclistobj = frappe.bean(doclist)
doclistobj.submit()
return [d.fields for d in doclist]
@webnotes.whitelist()
@frappe.whitelist()
def cancel(doctype, name):
wrapper = webnotes.bean(doctype, name)
wrapper = frappe.bean(doctype, name)
wrapper.cancel()
return [d.fields for d in wrapper.doclist]
@webnotes.whitelist()
@frappe.whitelist()
def delete(doctype, name):
webnotes.delete_doc(doctype, name)
frappe.delete_doc(doctype, name)
@webnotes.whitelist()
@frappe.whitelist()
def set_default(key, value, parent=None):
"""set a user default value"""
webnotes.conn.set_default(key, value, parent or webnotes.session.user)
webnotes.clear_cache(user=webnotes.session.user)
frappe.conn.set_default(key, value, parent or frappe.session.user)
frappe.clear_cache(user=frappe.session.user)
@webnotes.whitelist()
@frappe.whitelist()
def make_width_property_setter():
doclist = json.loads(webnotes.form_dict.doclist)
doclist = json.loads(frappe.form_dict.doclist)
if doclist[0]["doctype"]=="Property Setter" and doclist[0]["property"]=="width":
bean = webnotes.bean(doclist)
bean = frappe.bean(doclist)
bean.ignore_permissions = True
bean.insert()
@webnotes.whitelist()
@frappe.whitelist()
def bulk_update(docs):
docs = json.loads(docs)
failed_docs = []
@ -110,29 +110,29 @@ def bulk_update(docs):
ddoc = {key: val for key, val in doc.iteritems() if key not in ['doctype', 'docname']}
doctype = doc['doctype']
docname = doc['docname']
bean = webnotes.bean(doctype, docname)
bean = frappe.bean(doctype, docname)
bean.doc.update(ddoc)
bean.save()
except:
failed_docs.append({
'doc': doc,
'exc': webnotes.utils.get_traceback()
'exc': frappe.utils.get_traceback()
})
return {'failed_docs': failed_docs}
@webnotes.whitelist()
@frappe.whitelist()
def has_permission(doctype, docname, perm_type="read"):
# perm_type can be one of read, write, create, submit, cancel, report
return {"has_permission": webnotes.has_permission(doctype, perm_type.lower(), docname)}
return {"has_permission": frappe.has_permission(doctype, perm_type.lower(), docname)}
@webnotes.whitelist()
@frappe.whitelist()
def get_js(src):
contentpath = os.path.join(webnotes.local.sites_path, src)
contentpath = os.path.join(frappe.local.sites_path, src)
with open(contentpath, "r") as srcfile:
code = srcfile.read()
if webnotes.local.lang != "en":
if frappe.local.lang != "en":
code += "\n\n$.extend(wn._messages, {})".format(json.dumps(\
webnotes.get_lang_dict("jsfile", contentpath)))
frappe.get_lang_dict("jsfile", contentpath)))
return code

View file

@ -1,4 +1,4 @@
from webnotes import _
from frappe import _
data = {
"Calendar": {

View file

@ -1,4 +1,4 @@
from webnotes import _
from frappe import _
data = [
{

View file

@ -2,7 +2,7 @@
# MIT License. See license.txt
from __future__ import unicode_literals
import webnotes
import frappe
class DocType:
def __init__(self, d, dl):

View file

@ -2,16 +2,16 @@
# MIT License. See license.txt
from __future__ import unicode_literals
import webnotes, json
import frappe, json
class DocType:
def __init__(self, d, dl):
self.doc, self.doclist = d, dl
def validate(self):
if webnotes.conn.sql("""select count(*) from tabComment where comment_doctype=%s
if frappe.conn.sql("""select count(*) from tabComment where comment_doctype=%s
and comment_docname=%s""", (self.doc.doctype, self.doc.name))[0][0] >= 50:
webnotes.msgprint("Max Comments reached!", raise_exception=True)
frappe.msgprint("Max Comments reached!", raise_exception=True)
def on_update(self):
self.update_comment_in_doc()
@ -35,7 +35,7 @@ class DocType:
self.update_comments_in_parent(_comments)
except Exception, e:
if e.args[0]==1054:
from webnotes.model.db_schema import add_column
from frappe.model.db_schema import add_column
add_column(self.doc.comment_doctype, "_comments", "Text")
self.update_comment_in_doc()
elif e.args[0]==1146:
@ -45,13 +45,13 @@ class DocType:
raise
def get_comments_from_parent(self):
_comments = webnotes.conn.get_value(self.doc.comment_doctype,
_comments = frappe.conn.get_value(self.doc.comment_doctype,
self.doc.comment_docname, "_comments") or "[]"
return json.loads(_comments)
def update_comments_in_parent(self, _comments):
# use sql, so that we do not mess with the timestamp
webnotes.conn.sql("""update `tab%s` set `_comments`=%s where name=%s""" % (self.doc.comment_doctype,
frappe.conn.sql("""update `tab%s` set `_comments`=%s where name=%s""" % (self.doc.comment_doctype,
"%s", "%s"), (json.dumps(_comments), self.doc.comment_docname))
def on_trash(self):
@ -63,8 +63,8 @@ class DocType:
self.update_comments_in_parent(_comments)
def on_doctype_update():
if not webnotes.conn.sql("""show index from `tabComment`
if not frappe.conn.sql("""show index from `tabComment`
where Key_name="comment_doctype_docname_index" """):
webnotes.conn.commit()
webnotes.conn.sql("""alter table `tabComment`
frappe.conn.commit()
frappe.conn.sql("""alter table `tabComment`
add index comment_doctype_docname_index(comment_doctype, comment_docname)""")

View file

@ -2,14 +2,14 @@
# MIT License. See license.txt
from __future__ import unicode_literals
import webnotes, unittest, json
import frappe, unittest, json
# commented due to commits -- only run when comments are modified
# class TestComment(unittest.TestCase):
# def setUp(self):
# self.cleanup()
# self.test_rec = webnotes.bean({
# self.test_rec = frappe.bean({
# "doctype":"Event",
# "subject":"__Comment Test Event",
# "event_type": "Private",
@ -21,29 +21,29 @@ import webnotes, unittest, json
# self.cleanup()
#
# def cleanup(self):
# webnotes.conn.sql("""delete from tabEvent where subject='__Comment Test Event'""")
# webnotes.conn.sql("""delete from tabComment where comment='__Test Comment'""")
# webnotes.conn.commit()
# if "_comments" in webnotes.conn.get_table_columns("Event"):
# webnotes.conn.commit()
# webnotes.conn.sql("""alter table `tabEvent` drop column `_comments`""")
# frappe.conn.sql("""delete from tabEvent where subject='__Comment Test Event'""")
# frappe.conn.sql("""delete from tabComment where comment='__Test Comment'""")
# frappe.conn.commit()
# if "_comments" in frappe.conn.get_table_columns("Event"):
# frappe.conn.commit()
# frappe.conn.sql("""alter table `tabEvent` drop column `_comments`""")
#
# def test_add_comment(self):
# self.comment = webnotes.bean({
# self.comment = frappe.bean({
# "doctype":"Comment",
# "comment_doctype": self.test_rec.doc.doctype,
# "comment_docname": self.test_rec.doc.name,
# "comment": "__Test Comment"
# }).insert()
#
# test_rec = webnotes.doc(self.test_rec.doc.doctype, self.test_rec.doc.name)
# test_rec = frappe.doc(self.test_rec.doc.doctype, self.test_rec.doc.name)
# _comments = json.loads(test_rec.get("_comments"))
# self.assertTrue(_comments[0].get("comment")=="__Test Comment")
#
# def test_remove_comment(self):
# self.test_add_comment()
# webnotes.delete_doc("Comment", self.comment.doc.name)
# test_rec = webnotes.doc(self.test_rec.doc.doctype, self.test_rec.doc.name)
# frappe.delete_doc("Comment", self.comment.doc.name)
# test_rec = frappe.doc(self.test_rec.doc.doctype, self.test_rec.doc.name)
# _comments = json.loads(test_rec.get("_comments"))
# self.assertEqual(len(_comments), 0)
#

View file

@ -0,0 +1,10 @@
cur_frm.cscript.onload = function(doc) {
cur_frm.fields_dict.user.get_query = function() {
return {
query: "frappe.core.doctype.communication.communication.get_user"
}
};
if(doc.content)
doc.content = frappe.utils.remove_script_and_style(doc.content);
}

View file

@ -2,15 +2,15 @@
# MIT License. See license.txt
from __future__ import unicode_literals
import webnotes
import frappe
import json
import urllib
from email.utils import formataddr
from webnotes.website.utils import is_signup_enabled
from webnotes.utils import get_url, cstr
from webnotes.utils.email_lib.email_body import get_email
from webnotes.utils.email_lib.smtp import send
from webnotes.utils import scrub_urls
from frappe.website.utils import is_signup_enabled
from frappe.utils import get_url, cstr
from frappe.utils.email_lib.email_body import get_email
from frappe.utils.email_lib.smtp import send
from frappe.utils import scrub_urls
class DocType():
def __init__(self, doc, doclist=None):
@ -18,7 +18,7 @@ class DocType():
self.doclist = doclist
def get_parent_bean(self):
return webnotes.bean(self.doc.parenttype, self.doc.parent)
return frappe.bean(self.doc.parenttype, self.doc.parent)
def update_parent(self):
"""update status of parent Lead or Contact based on who is replying"""
@ -29,13 +29,13 @@ class DocType():
def on_update(self):
self.update_parent()
@webnotes.whitelist()
@frappe.whitelist()
def make(doctype=None, name=None, content=None, subject=None, sent_or_received = "Sent",
sender=None, recipients=None, communication_medium="Email", send_email=False,
print_html=None, attachments='[]', send_me_a_copy=False, set_lead=True, date=None):
if doctype and name and not webnotes.has_permission(doctype, "email", name):
raise webnotes.PermissionError("You are not allowed to send emails related to: {doctype} {name}".format(
if doctype and name and not frappe.has_permission(doctype, "email", name):
raise frappe.PermissionError("You are not allowed to send emails related to: {doctype} {name}".format(
doctype=doctype, name=name))
_make(doctype=doctype, name=name, content=content, subject=subject, sent_or_received=sent_or_received,
@ -60,16 +60,16 @@ def _make(doctype=None, name=None, content=None, subject=None, sent_or_received
if isinstance(sender, (tuple, list)) and len(sender)==2:
sender = formataddr(sender)
comm = webnotes.new_bean('Communication')
comm = frappe.new_bean('Communication')
d = comm.doc
d.subject = subject
d.content = content
d.sent_or_received = sent_or_received
d.sender = sender or webnotes.conn.get_value("Profile", webnotes.session.user, "email")
d.sender = sender or frappe.conn.get_value("Profile", frappe.session.user, "email")
d.recipients = recipients
# add as child
sent_via = webnotes.get_obj(doctype, name)
sent_via = frappe.get_obj(doctype, name)
d.parent = name
d.parenttype = doctype
d.parentfield = "communications"
@ -86,15 +86,15 @@ def _make(doctype=None, name=None, content=None, subject=None, sent_or_received
d = comm.doc
send_comm_email(d, name, sent_via, print_html, attachments, send_me_a_copy)
@webnotes.whitelist()
@frappe.whitelist()
def get_customer_supplier(args=None):
"""
Get Customer/Supplier, given a contact, if a unique match exists
"""
if not args: args = webnotes.local.form_dict
if not args: args = frappe.local.form_dict
if not args.get('contact'):
raise Exception, "Please specify a contact to fetch Customer/Supplier"
result = webnotes.conn.sql("""\
result = frappe.conn.sql("""\
select customer, supplier
from `tabContact`
where name = %s""", args.get('contact'), as_dict=1)
@ -118,7 +118,7 @@ def send_comm_email(d, name, sent_via=None, print_html=None, attachments='[]', s
footer = set_portal_link(sent_via, d)
send_print_in_body = webnotes.conn.get_value("Email Settings", None, "send_print_in_body_and_attachment")
send_print_in_body = frappe.conn.get_value("Email Settings", None, "send_print_in_body_and_attachment")
if not send_print_in_body:
d.content += "<p>Please see attachment for document details.</p>"
@ -126,7 +126,7 @@ def send_comm_email(d, name, sent_via=None, print_html=None, attachments='[]', s
msg=d.content, footer=footer, print_html=print_html if send_print_in_body else None)
if send_me_a_copy:
mail.cc.append(webnotes.conn.get_value("Profile", webnotes.session.user, "email"))
mail.cc.append(frappe.conn.get_value("Profile", frappe.session.user, "email"))
if print_html:
print_html = scrub_urls(print_html)
@ -136,7 +136,7 @@ def send_comm_email(d, name, sent_via=None, print_html=None, attachments='[]', s
try:
mail.attach_file(a)
except IOError, e:
webnotes.msgprint("""Unable to find attachment %s. Please resend without attaching this file.""" % a,
frappe.msgprint("""Unable to find attachment %s. Please resend without attaching this file.""" % a,
raise_exception=True)
send(mail)

View file

@ -2,10 +2,10 @@
# MIT License. See license.txt
from __future__ import unicode_literals
import webnotes
import frappe
from webnotes import form, msgprint
import webnotes.defaults
from frappe import form, msgprint
import frappe.defaults
class DocType:
def __init__(self, doc, doclist):
@ -14,5 +14,5 @@ class DocType:
def on_update(self):
# clear cache on save
webnotes.cache().delete_value('time_zone')
webnotes.clear_cache()
frappe.cache().delete_value('time_zone')
frappe.clear_cache()

View file

@ -58,8 +58,8 @@ cur_frm.cscript.dt = function(doc, dt, dn) {
set_field_options('insert_after', '');
return;
}
return wn.call({
method: 'webnotes.core.doctype.custom_field.custom_field.get_fields_label',
return frappe.call({
method: 'frappe.core.doctype.custom_field.custom_field.get_fields_label',
args: { doctype: doc.dt, fieldname: doc.fieldname },
callback: function(r, rt) {
doc = locals[doc.doctype][doc.name];

View file

@ -2,9 +2,9 @@
# MIT License. See license.txt
from __future__ import unicode_literals
import webnotes
from webnotes.utils import cint, cstr
from webnotes import _
import frappe
from frappe.utils import cint, cstr
from frappe import _
class DocType:
def __init__(self, d, dl):
@ -17,13 +17,13 @@ class DocType:
def set_fieldname(self):
if not self.doc.fieldname:
if not self.doc.label:
webnotes.throw(_("Label is mandatory"))
frappe.throw(_("Label is mandatory"))
# remove special characters from fieldname
self.doc.fieldname = filter(lambda x: x.isdigit() or x.isalpha() or '_',
cstr(self.doc.label).lower().replace(' ','_'))
def validate(self):
from webnotes.model.doctype import get
from frappe.model.doctype import get
temp_doclist = get(self.doc.dt).get_parent_doclist()
# set idx
@ -33,28 +33,28 @@ class DocType:
def on_update(self):
# validate field
from webnotes.core.doctype.doctype.doctype import validate_fields_for_doctype
from frappe.core.doctype.doctype.doctype import validate_fields_for_doctype
validate_fields_for_doctype(self.doc.dt)
webnotes.clear_cache(doctype=self.doc.dt)
frappe.clear_cache(doctype=self.doc.dt)
# create property setter to emulate insert after
self.create_property_setter()
# update the schema
from webnotes.model.db_schema import updatedb
from frappe.model.db_schema import updatedb
updatedb(self.doc.dt)
def on_trash(self):
# delete property setter entries
webnotes.conn.sql("""\
frappe.conn.sql("""\
DELETE FROM `tabProperty Setter`
WHERE doc_type = %s
AND field_name = %s""",
(self.doc.dt, self.doc.fieldname))
webnotes.clear_cache(doctype=self.doc.dt)
frappe.clear_cache(doctype=self.doc.dt)
def create_property_setter(self):
if not self.doc.insert_after: return
@ -63,35 +63,35 @@ class DocType:
if label_index==-1: return
prev_field = field_list[label_index]
webnotes.conn.sql("""\
frappe.conn.sql("""\
DELETE FROM `tabProperty Setter`
WHERE doc_type = %s
AND field_name = %s
AND property = 'previous_field'""", (self.doc.dt, self.doc.fieldname))
webnotes.make_property_setter({
frappe.make_property_setter({
"doctype":self.doc.dt,
"fieldname": self.doc.fieldname,
"property": "previous_field",
"value": prev_field
})
@webnotes.whitelist()
@frappe.whitelist()
def get_fields_label(dt=None, form=1):
"""
if form=1: Returns a string of field labels separated by \n
if form=0: Returns lists of field labels and field names
"""
import webnotes
from webnotes.utils import cstr
import webnotes.model.doctype
import frappe
from frappe.utils import cstr
import frappe.model.doctype
fieldname = None
if not dt:
dt = webnotes.form_dict.get('doctype')
fieldname = webnotes.form_dict.get('fieldname')
dt = frappe.form_dict.get('doctype')
fieldname = frappe.form_dict.get('fieldname')
if not dt: return ""
doclist = webnotes.model.doctype.get(dt)
doclist = frappe.model.doctype.get(dt)
docfields = sorted(doclist.get({"parent": dt, "doctype": "DocField"}),
key=lambda d: d.idx)
@ -109,12 +109,12 @@ def get_fields_label(dt=None, form=1):
return idx_label_list, field_list
def create_custom_field_if_values_exist(doctype, df):
df = webnotes._dict(df)
if df.fieldname in webnotes.conn.get_table_columns(doctype) and \
webnotes.conn.sql("""select count(*) from `tab{doctype}`
df = frappe._dict(df)
if df.fieldname in frappe.conn.get_table_columns(doctype) and \
frappe.conn.sql("""select count(*) from `tab{doctype}`
where ifnull({fieldname},'')!=''""".format(doctype=doctype, fieldname=df.fieldname))[0][0] and \
not webnotes.conn.get_value("Custom Field", {"dt": doctype, "fieldname": df.fieldname}):
webnotes.bean({
not frappe.conn.get_value("Custom Field", {"dt": doctype, "fieldname": df.fieldname}):
frappe.bean({
"doctype":"Custom Field",
"dt": doctype,
"permlevel": df.permlevel or 0,

View file

@ -1,8 +1,8 @@
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
# MIT License. See license.txt
from __future__ import unicode_literals
import webnotes
from webnotes.utils import cstr
import frappe
from frappe.utils import cstr
class DocType:
def __init__(self, d, dl):
@ -12,8 +12,8 @@ class DocType:
self.doc.name = self.doc.dt + "-" + self.doc.script_type
def on_update(self):
webnotes.clear_cache(doctype=self.doc.dt)
frappe.clear_cache(doctype=self.doc.dt)
def on_trash(self):
webnotes.clear_cache(doctype=self.doc.dt)
frappe.clear_cache(doctype=self.doc.dt)

View file

@ -70,9 +70,9 @@ cur_frm.cscript.refresh = function() {
cur_frm.cscript.hide_allow_attach(cur_frm.doc);
if(wn.route_options) {
wn.model.set_value("Customize Form", null, "doc_type", wn.route_options.doctype)
wn.route_options = null;
if(frappe.route_options) {
frappe.model.set_value("Customize Form", null, "doc_type", frappe.route_options.doctype)
frappe.route_options = null;
}
}
@ -97,7 +97,7 @@ cur_frm.cscript.hide_allow_attach = function(doc) {
}
cur_frm.confirm = function(msg, doc, dt, dn) {
var d = new wn.ui.Dialog({
var d = new frappe.ui.Dialog({
title: 'Reset To Defaults',
width: 500
});
@ -145,7 +145,7 @@ cur_frm.add_fields_help = function() {
<a id="fields_help" class="link_type">Help</a>\
</div>');
$('#fields_help').click(function() {
var d = new wn.ui.Dialog({
var d = new frappe.ui.Dialog({
title: 'Help: Field Properties',
width: 600
});

View file

@ -6,8 +6,8 @@ from __future__ import unicode_literals
Customize Form is a Single DocType used to mask the Property Setter
Thus providing a better UI from user perspective
"""
import webnotes, json
from webnotes.utils import cstr
import frappe, json
from frappe.utils import cstr
class DocType:
def __init__(self, doc, doclist=[]):
@ -57,7 +57,7 @@ class DocType:
self.clear()
if self.doc.doc_type:
from webnotes.model.doc import addchild
from frappe.model.doc import addchild
for d in self.get_ref_doclist():
if d.doctype=='DocField':
@ -80,10 +80,10 @@ class DocType:
* Applies property setter properties on the doclist
* returns the modified doclist
"""
from webnotes.model.doctype import get
from frappe.model.doctype import get
ref_doclist = get(self.doc.doc_type)
ref_doclist = webnotes.doclist([ref_doclist[0]]
ref_doclist = frappe.doclist([ref_doclist[0]]
+ ref_doclist.get({"parent": self.doc.doc_type}))
return ref_doclist
@ -120,7 +120,7 @@ class DocType:
for f in args['list']:
args['doc_to_set'].fields[f] = args['doc'].fields.get(f)
else:
webnotes.msgprint("Please specify args['list'] to set", raise_exception=1)
frappe.msgprint("Please specify args['list'] to set", raise_exception=1)
def post(self):
@ -128,10 +128,10 @@ class DocType:
Save diff between Customize Form Bean and DocType Bean as property setter entries
"""
if self.doc.doc_type:
from webnotes.model import doc
from webnotes.core.doctype.doctype.doctype import validate_fields_for_doctype
from frappe.model import doc
from frappe.core.doctype.doctype.doctype import validate_fields_for_doctype
this_doclist = webnotes.doclist([self.doc] + self.doclist)
this_doclist = frappe.doclist([self.doc] + self.doclist)
ref_doclist = self.get_ref_doclist()
dt_doclist = doc.get('DocType', self.doc.doc_type)
@ -146,8 +146,8 @@ class DocType:
validate_fields_for_doctype(self.doc.doc_type)
webnotes.clear_cache(doctype=self.doc.doc_type)
webnotes.msgprint("Updated")
frappe.clear_cache(doctype=self.doc.doc_type)
frappe.msgprint("Updated")
def diff(self, new_dl, ref_dl, dt_dl):
@ -174,7 +174,7 @@ class DocType:
if self.has_property_changed(ref_d, new_d, prop):
# using set_value not bean because validations are called
# in the end anyways
webnotes.conn.set_value("Custom Field", ref_d.name, prop, new_d.get(prop))
frappe.conn.set_value("Custom Field", ref_d.name, prop, new_d.get(prop))
else:
d = self.prepare_to_set(prop, new_d, ref_d, dt_dl)
if d: diff_list.append(d)
@ -193,7 +193,7 @@ class DocType:
"""
Get fieldtype and default value for properties of a field
"""
df_defaults = webnotes.conn.sql("""
df_defaults = frappe.conn.sql("""
SELECT fieldname, fieldtype, `default`, label
FROM `tabDocField`
WHERE parent='DocField' or parent='DocType'""", as_dict=1)
@ -225,7 +225,7 @@ class DocType:
"""
# Check if property has changed compared to when it was loaded
if self.has_property_changed(ref_d, new_d, prop):
#webnotes.msgprint("new: " + str(new_d.fields[prop]) + " | old: " + str(ref_d.fields[prop]))
#frappe.msgprint("new: " + str(new_d.fields[prop]) + " | old: " + str(ref_d.fields[prop]))
# Check if the new property is same as that in original doctype
# If yes, we need to delete the property setter entry
for dt_d in dt_doclist:
@ -253,7 +253,7 @@ class DocType:
allow_change = True
break
if not allow_change:
webnotes.msgprint("""\
frappe.msgprint("""\
You cannot change '%s' of '%s' from '%s' to '%s'.
%s can only be changed among %s.
<i>Ignoring this change and saving.</i>""" % \
@ -267,7 +267,7 @@ class DocType:
# If the above conditions are fulfilled,
# create a property setter doc, but dont save it yet.
from webnotes.model.doc import Document
from frappe.model.doc import Document
d = Document('Property Setter')
d.doctype_or_field = ref_d.doctype=='DocField' and 'DocField' or 'DocType'
d.doc_type = self.doc.doc_type
@ -294,7 +294,7 @@ class DocType:
if d.doctype=="Customize Form Field":
fields.append(d.fieldname)
d = webnotes.doc('Property Setter')
d = frappe.doc('Property Setter')
d.doctype_or_field = 'DocType'
d.doc_type = self.doc.doc_type
d.property = "_idx"
@ -312,12 +312,12 @@ class DocType:
for d in ps_doclist:
# Delete existing property setter entry
if not d.fields.get("field_name"):
webnotes.conn.sql("""
frappe.conn.sql("""
DELETE FROM `tabProperty Setter`
WHERE doc_type = %(doc_type)s
AND property = %(property)s""", d.fields)
else:
webnotes.conn.sql("""
frappe.conn.sql("""
DELETE FROM `tabProperty Setter`
WHERE doc_type = %(doc_type)s
AND field_name = %(field_name)s
@ -334,11 +334,11 @@ class DocType:
and resets it to standard
"""
if self.doc.doc_type:
webnotes.conn.sql("""
frappe.conn.sql("""
DELETE FROM `tabProperty Setter`
WHERE doc_type = %s""", self.doc.doc_type)
webnotes.clear_cache(doctype=self.doc.doc_type)
frappe.clear_cache(doctype=self.doc.doc_type)
self.get()

View file

@ -2,7 +2,7 @@
# MIT License. See license.txt
from __future__ import unicode_literals
import webnotes
import frappe
class DocType:
def __init__(self, d, dl):

View file

@ -2,7 +2,7 @@
# MIT License. See license.txt
from __future__ import unicode_literals
import webnotes
import frappe
class DocType:
def __init__(self, d, dl):

View file

@ -2,21 +2,21 @@
# MIT License. See license.txt
from __future__ import unicode_literals
import webnotes
import frappe
class DocType:
def __init__(self, d, dl):
self.doc, self.doclist = d, dl
def on_doctype_update():
if not webnotes.conn.sql("""show index from `tabDefaultValue`
if not frappe.conn.sql("""show index from `tabDefaultValue`
where Key_name="defaultvalue_parent_defkey_index" """):
webnotes.conn.commit()
webnotes.conn.sql("""alter table `tabDefaultValue`
frappe.conn.commit()
frappe.conn.sql("""alter table `tabDefaultValue`
add index defaultvalue_parent_defkey_index(parent, defkey)""")
if not webnotes.conn.sql("""show index from `tabDefaultValue`
if not frappe.conn.sql("""show index from `tabDefaultValue`
where Key_name="defaultvalue_parent_parenttype_index" """):
webnotes.conn.commit()
webnotes.conn.sql("""alter table `tabDefaultValue`
frappe.conn.commit()
frappe.conn.sql("""alter table `tabDefaultValue`
add index defaultvalue_parent_parenttype_index(parent, parenttype)""")

View file

@ -2,7 +2,7 @@
# MIT License. See license.txt
from __future__ import unicode_literals
import webnotes
import frappe
class DocType:
def __init__(self, d, dl):

View file

@ -2,7 +2,7 @@
# MIT License. See license.txt
from __future__ import unicode_literals
import webnotes
import frappe
class DocType:
def __init__(self, d, dl):

View file

@ -3,12 +3,12 @@
from __future__ import unicode_literals
import webnotes
from webnotes import msgprint, _
import frappe
from frappe import msgprint, _
import os
from webnotes.utils import now, cint
from webnotes.model import no_value_fields
from frappe.utils import now, cint
from frappe.model import no_value_fields
class DocType:
def __init__(self, doc=None, doclist=[]):
@ -16,11 +16,11 @@ class DocType:
self.doclist = doclist
def validate(self):
if not webnotes.conf.get("developer_mode"):
webnotes.throw("Not in Developer Mode! Set in site_config.json")
if not frappe.conf.get("developer_mode"):
frappe.throw("Not in Developer Mode! Set in site_config.json")
for c in [".", "/", "#", "&", "=", ":", "'", '"']:
if c in self.doc.name:
webnotes.msgprint(c + " not allowed in name", raise_exception=1)
frappe.msgprint(c + " not allowed in name", raise_exception=1)
self.validate_series()
self.scrub_field_names()
self.validate_title_field()
@ -30,12 +30,12 @@ class DocType:
self.check_link_replacement_error()
def change_modified_of_parent(self):
if webnotes.flags.in_import:
if frappe.flags.in_import:
return
parent_list = webnotes.conn.sql("""SELECT parent
parent_list = frappe.conn.sql("""SELECT parent
from tabDocField where fieldtype="Table" and options="%s" """ % self.doc.name)
for p in parent_list:
webnotes.conn.sql('''UPDATE tabDocType SET modified="%s"
frappe.conn.sql('''UPDATE tabDocType SET modified="%s"
WHERE `name`="%s"''' % (now(), p[0]))
def scrub_field_names(self):
@ -55,7 +55,7 @@ class DocType:
def validate_title_field(self):
if self.doc.title_field and \
self.doc.title_field not in [d.fieldname for d in self.doclist.get({"doctype":"DocField"})]:
webnotes.throw(_("Title field must be a valid fieldname"))
frappe.throw(_("Title field must be a valid fieldname"))
def validate_series(self, autoname=None, name=None):
if not autoname: autoname = self.doc.autoname
@ -67,63 +67,63 @@ class DocType:
if autoname and (not autoname.startswith('field:')) and (not autoname.startswith('eval:')) \
and (not autoname=='Prompt') and (not autoname.startswith('naming_series:')):
prefix = autoname.split('.')[0]
used_in = webnotes.conn.sql('select name from tabDocType where substring_index(autoname, ".", 1) = %s and name!=%s', (prefix, name))
used_in = frappe.conn.sql('select name from tabDocType where substring_index(autoname, ".", 1) = %s and name!=%s', (prefix, name))
if used_in:
msgprint('<b>Series already in use:</b> The series "%s" is already used in "%s"' % (prefix, used_in[0][0]), raise_exception=1)
def on_update(self):
from webnotes.model.db_schema import updatedb
from frappe.model.db_schema import updatedb
updatedb(self.doc.name)
self.change_modified_of_parent()
make_module_and_roles(self.doclist)
from webnotes import conf
if (not webnotes.flags.in_import) and conf.get('developer_mode') or 0:
from frappe import conf
if (not frappe.flags.in_import) and conf.get('developer_mode') or 0:
self.export_doc()
self.make_controller_template()
# update index
if not self.doc.custom:
from webnotes.model.code import load_doctype_module
from frappe.model.code import load_doctype_module
module = load_doctype_module( self.doc.name, self.doc.module)
if hasattr(module, "on_doctype_update"):
module.on_doctype_update()
webnotes.clear_cache(doctype=self.doc.name)
frappe.clear_cache(doctype=self.doc.name)
def check_link_replacement_error(self):
for d in self.doclist.get({"doctype":"DocField", "fieldtype":"Select"}):
if (webnotes.conn.get_value("DocField", d.name, "options") or "").startswith("link:") \
if (frappe.conn.get_value("DocField", d.name, "options") or "").startswith("link:") \
and not d.options.startswith("link:"):
webnotes.msgprint("link: type Select fields are getting replaced. Please check for %s" % d.label,
frappe.msgprint("link: type Select fields are getting replaced. Please check for %s" % d.label,
raise_exception=True)
def on_trash(self):
webnotes.conn.sql("delete from `tabCustom Field` where dt = %s", self.doc.name)
webnotes.conn.sql("delete from `tabCustom Script` where dt = %s", self.doc.name)
webnotes.conn.sql("delete from `tabProperty Setter` where doc_type = %s", self.doc.name)
webnotes.conn.sql("delete from `tabReport` where ref_doctype=%s", self.doc.name)
frappe.conn.sql("delete from `tabCustom Field` where dt = %s", self.doc.name)
frappe.conn.sql("delete from `tabCustom Script` where dt = %s", self.doc.name)
frappe.conn.sql("delete from `tabProperty Setter` where doc_type = %s", self.doc.name)
frappe.conn.sql("delete from `tabReport` where ref_doctype=%s", self.doc.name)
def before_rename(self, old, new, merge=False):
if merge:
webnotes.throw(_("DocType can not be merged"))
frappe.throw(_("DocType can not be merged"))
def after_rename(self, old, new, merge=False):
if self.doc.issingle:
webnotes.conn.sql("""update tabSingles set doctype=%s where doctype=%s""", (new, old))
frappe.conn.sql("""update tabSingles set doctype=%s where doctype=%s""", (new, old))
else:
webnotes.conn.sql("rename table `tab%s` to `tab%s`" % (old, new))
frappe.conn.sql("rename table `tab%s` to `tab%s`" % (old, new))
def export_doc(self):
from webnotes.modules.export_file import export_to_files
from frappe.modules.export_file import export_to_files
export_to_files(record_list=[['DocType', self.doc.name]])
def import_doc(self):
from webnotes.modules.import_module import import_from_files
from frappe.modules.import_module import import_from_files
import_from_files(record_list=[[self.doc.module, 'doctype', self.doc.name]])
def make_controller_template(self):
from webnotes.modules import get_doc_path, get_module_path, scrub
from frappe.modules import get_doc_path, get_module_path, scrub
pypath = os.path.join(get_doc_path(self.doc.module,
self.doc.doctype, self.doc.name), scrub(self.doc.name) + '.py')
@ -139,7 +139,7 @@ class DocType:
if is_submittable is set, add amended_from docfields
"""
if self.doc.is_submittable:
if not webnotes.conn.sql("""select name from tabDocField
if not frappe.conn.sql("""select name from tabDocField
where fieldname = 'amended_from' and parent = %s""", self.doc.name):
new = self.doc.addchild('fields', 'DocField', self.doclist)
new.label = 'Amended From'
@ -153,12 +153,12 @@ class DocType:
new.idx = self.get_max_idx() + 1
def get_max_idx(self):
max_idx = webnotes.conn.sql("""select max(idx) from `tabDocField` where parent = %s""",
max_idx = frappe.conn.sql("""select max(idx) from `tabDocField` where parent = %s""",
self.doc.name)
return max_idx and max_idx[0][0] or 0
def validate_fields_for_doctype(doctype):
from webnotes.model.doctype import get
from frappe.model.doctype import get
validate_fields(get(doctype, cached=False).get({"parent":doctype,
"doctype":"DocField"}))
@ -167,33 +167,33 @@ def validate_fields(fields):
for c in ['.', ',', ' ', '-', '&', '%', '=', '"', "'", '*', '$',
'(', ')', '[', ']', '/']:
if c in fieldname:
webnotes.msgprint("'%s' not allowed in fieldname (%s)" % (c, fieldname))
frappe.msgprint("'%s' not allowed in fieldname (%s)" % (c, fieldname))
def check_unique_fieldname(fieldname):
duplicates = filter(None, map(lambda df: df.fieldname==fieldname and str(df.idx) or None, fields))
if len(duplicates) > 1:
webnotes.msgprint('Fieldname <b>%s</b> appears more than once in rows (%s). Please rectify' \
frappe.msgprint('Fieldname <b>%s</b> appears more than once in rows (%s). Please rectify' \
% (fieldname, ', '.join(duplicates)), raise_exception=1)
def check_illegal_mandatory(d):
if d.fieldtype in ('HTML', 'Button', 'Section Break', 'Column Break') and d.reqd:
webnotes.msgprint('%(label)s [%(fieldtype)s] cannot be mandatory' % d.fields,
frappe.msgprint('%(label)s [%(fieldtype)s] cannot be mandatory' % d.fields,
raise_exception=1)
def check_link_table_options(d):
if d.fieldtype in ("Link", "Table"):
if not d.options:
webnotes.msgprint("""#%(idx)s %(label)s: Options must be specified for Link and Table type fields""" % d.fields,
frappe.msgprint("""#%(idx)s %(label)s: Options must be specified for Link and Table type fields""" % d.fields,
raise_exception=1)
if d.options=="[Select]":
return
if d.options != d.parent and not webnotes.conn.exists("DocType", d.options):
webnotes.msgprint("""#%(idx)s %(label)s: Options %(options)s must be a valid "DocType" for Link and Table type fields""" % d.fields,
if d.options != d.parent and not frappe.conn.exists("DocType", d.options):
frappe.msgprint("""#%(idx)s %(label)s: Options %(options)s must be a valid "DocType" for Link and Table type fields""" % d.fields,
raise_exception=1)
def check_hidden_and_mandatory(d):
if d.hidden and d.reqd and not d.default:
webnotes.msgprint("""#%(idx)s %(label)s: Cannot be hidden and mandatory (reqd) without default""" % d.fields,
frappe.msgprint("""#%(idx)s %(label)s: Cannot be hidden and mandatory (reqd) without default""" % d.fields,
raise_exception=True)
def check_max_items_in_list(fields):
@ -201,20 +201,20 @@ def validate_fields(fields):
for d in fields:
if d.in_list_view: count+=1
if count > 5:
webnotes.msgprint("""Max 5 Fields can be set as 'In List View', please unselect a field before selecting a new one.""")
frappe.msgprint("""Max 5 Fields can be set as 'In List View', please unselect a field before selecting a new one.""")
def check_width(d):
if d.fieldtype == "Currency" and cint(d.width) < 100:
webnotes.msgprint("Minimum width for FieldType 'Currency' is 100px", raise_exception=1)
frappe.msgprint("Minimum width for FieldType 'Currency' is 100px", raise_exception=1)
def check_in_list_view(d):
if d.in_list_view and d.fieldtype!="Image" and (d.fieldtype in no_value_fields):
webnotes.msgprint("'In List View' not allowed for field of type '%s'" % d.fieldtype, raise_exception=1)
frappe.msgprint("'In List View' not allowed for field of type '%s'" % d.fieldtype, raise_exception=1)
for d in fields:
if not d.permlevel: d.permlevel = 0
if not d.fieldname:
webnotes.msgprint("Fieldname is mandatory in row %s" % d.idx, raise_exception=1)
frappe.msgprint("Fieldname is mandatory in row %s" % d.idx, raise_exception=1)
check_illegal_characters(d.fieldname)
check_unique_fieldname(d.fieldname)
check_illegal_mandatory(d)
@ -223,7 +223,7 @@ def validate_fields(fields):
check_in_list_view(d)
def validate_permissions_for_doctype(doctype, for_remove=False):
from webnotes.model.doctype import get
from frappe.model.doctype import get
validate_permissions(get(doctype, cached=False).get({"parent":doctype,
"doctype":"DocPerm"}), for_remove)
@ -231,7 +231,7 @@ def validate_permissions(permissions, for_remove=False):
doctype = permissions and permissions[0].parent
issingle = issubmittable = isimportable = False
if doctype and not doctype.startswith("New DocType"):
values = webnotes.conn.get_value("DocType", doctype,
values = frappe.conn.get_value("DocType", doctype,
["issingle", "is_submittable", "allow_import"], as_dict=True)
issingle = cint(values.issingle)
issubmittable = cint(values.is_submittable)
@ -242,7 +242,7 @@ def validate_permissions(permissions, for_remove=False):
def check_atleast_one_set(d):
if not d.read and not d.write and not d.submit and not d.cancel and not d.create:
webnotes.msgprint(get_txt(d) + " Atleast one of Read, Write, Create, Submit, Cancel must be set.",
frappe.msgprint(get_txt(d) + " Atleast one of Read, Write, Create, Submit, Cancel must be set.",
raise_exception=True)
def check_double(d):
@ -253,37 +253,37 @@ def validate_permissions(permissions, for_remove=False):
})
if len(similar) > 1:
webnotes.msgprint(get_txt(d) + " Only one rule allowed for a particular Role and Level.",
frappe.msgprint(get_txt(d) + " Only one rule allowed for a particular Role and Level.",
raise_exception=True)
def check_level_zero_is_set(d):
if cint(d.permlevel) > 0 and d.role != 'All':
if not permissions.get({"role": d.role, "permlevel": 0}):
webnotes.msgprint(get_txt(d) + " Higher level permissions are meaningless if level 0 permission is not set.",
frappe.msgprint(get_txt(d) + " Higher level permissions are meaningless if level 0 permission is not set.",
raise_exception=True)
if d.create or d.submit or d.cancel or d.amend or d.match:
webnotes.msgprint("Create, Submit, Cancel, Amend, Match has no meaning at level " + d.permlevel,
frappe.msgprint("Create, Submit, Cancel, Amend, Match has no meaning at level " + d.permlevel,
raise_exception=True)
def check_permission_dependency(d):
if d.write and not d.read:
webnotes.msgprint(get_txt(d) + " Cannot set Write permission if Read is not set.",
frappe.msgprint(get_txt(d) + " Cannot set Write permission if Read is not set.",
raise_exception=True)
if d.cancel and not d.submit:
webnotes.msgprint(get_txt(d) + " Cannot set Cancel permission if Submit is not set.",
frappe.msgprint(get_txt(d) + " Cannot set Cancel permission if Submit is not set.",
raise_exception=True)
if (d.submit or d.cancel or d.amend) and not d.write:
webnotes.msgprint(get_txt(d) + " Cannot set Submit, Cancel, Amend permission if Write is not set.",
frappe.msgprint(get_txt(d) + " Cannot set Submit, Cancel, Amend permission if Write is not set.",
raise_exception=True)
if d.amend and not d.write:
webnotes.msgprint(get_txt(d) + " Cannot set Amend if Cancel is not set.",
frappe.msgprint(get_txt(d) + " Cannot set Amend if Cancel is not set.",
raise_exception=True)
if (d.fields.get("import") or d.export) and not d.report:
webnotes.msgprint(get_txt(d) + " Cannot set Import or Export permission if Report is not set.",
frappe.msgprint(get_txt(d) + " Cannot set Import or Export permission if Report is not set.",
raise_exception=True)
if d.fields.get("import") and not d.create:
webnotes.msgprint(get_txt(d) + " Cannot set Import if Create is not set.",
frappe.msgprint(get_txt(d) + " Cannot set Import if Create is not set.",
raise_exception=True)
def remove_rights_for_single(d):
@ -291,28 +291,28 @@ def validate_permissions(permissions, for_remove=False):
return
if d.report:
webnotes.msgprint("{doctype} {meaningless}".format(doctype=doctype,
frappe.msgprint("{doctype} {meaningless}".format(doctype=doctype,
meaningless=_("is a single DocType, permission of type Report is meaningless.")))
d.report = 0
d.fields["import"] = 0
d.fields["export"] = 0
if d.restrict:
webnotes.msgprint("{doctype} {meaningless}".format(doctype=doctype,
frappe.msgprint("{doctype} {meaningless}".format(doctype=doctype,
meaningless=_("is a single DocType, permission of type Restrict is meaningless.")))
d.restrict = 0
def check_if_submittable(d):
if d.submit and not issubmittable:
webnotes.msgprint(doctype + " is not Submittable, cannot assign submit rights.",
frappe.msgprint(doctype + " is not Submittable, cannot assign submit rights.",
raise_exception=True)
elif d.amend and not issubmittable:
webnotes.msgprint(doctype + " is not Submittable, cannot assign amend rights.",
frappe.msgprint(doctype + " is not Submittable, cannot assign amend rights.",
raise_exception=True)
def check_if_importable(d):
if d.fields.get("import") and not isimportable:
webnotes.throw("{doctype}: {not_importable}".format(doctype=doctype,
frappe.throw("{doctype}: {not_importable}".format(doctype=doctype,
not_importable=_("is not allowed to be imported, cannot assign import rights.")))
for d in permissions:
@ -329,21 +329,21 @@ def validate_permissions(permissions, for_remove=False):
def make_module_and_roles(doclist, perm_doctype="DocPerm"):
try:
if not webnotes.conn.exists("Module Def", doclist[0].module):
m = webnotes.bean({"doctype": "Module Def", "module_name": doclist[0].module})
if not frappe.conn.exists("Module Def", doclist[0].module):
m = frappe.bean({"doctype": "Module Def", "module_name": doclist[0].module})
m.insert()
default_roles = ["Administrator", "Guest", "All"]
roles = [p.role for p in doclist.get({"doctype": perm_doctype})] + default_roles
for role in list(set(roles)):
if not webnotes.conn.exists("Role", role):
r = webnotes.bean({"doctype": "Role", "role_name": role})
if not frappe.conn.exists("Role", role):
r = frappe.bean({"doctype": "Role", "role_name": role})
r.doc.role_name = role
r.insert()
except webnotes.DoesNotExistError, e:
except frappe.DoesNotExistError, e:
pass
except webnotes.SQLError, e:
except frappe.SQLError, e:
if e.args[0]==1146:
pass
else:

View file

@ -4,7 +4,7 @@
# For license information, please see license.txt
from __future__ import unicode_literals
import webnotes
import frappe
class DocType:
def __init__(self, d, dl):

View file

@ -2,9 +2,9 @@
# MIT License. See license.txt
from __future__ import unicode_literals
import webnotes
import frappe
from webnotes.utils import getdate, cint, add_months, date_diff, add_days, nowdate
from frappe.utils import getdate, cint, add_months, date_diff, add_days, nowdate
weekdays = ["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"]
@ -14,7 +14,7 @@ class DocType:
def validate(self):
if self.doc.starts_on and self.doc.ends_on and self.doc.starts_on > self.doc.ends_on:
webnotes.msgprint(webnotes._("Event End must be after Start"), raise_exception=True)
frappe.msgprint(frappe._("Event End must be after Start"), raise_exception=True)
def get_permission_query_conditions():
return """(tabEvent.event_type='Public' or tabEvent.owner='%(user)s'
@ -24,24 +24,24 @@ def get_permission_query_conditions():
`tabEvent Role`.parent=tabEvent.name
and `tabEvent Role`.role in ('%(roles)s')))
""" % {
"user": webnotes.session.user,
"roles": "', '".join(webnotes.get_roles(webnotes.session.user))
"user": frappe.session.user,
"roles": "', '".join(frappe.get_roles(frappe.session.user))
}
def has_permission(doc):
if doc.event_type=="Public" or doc.owner==webnotes.session.user:
if doc.event_type=="Public" or doc.owner==frappe.session.user:
return True
# need full doclist to check roles and users
bean = webnotes.bean("Event", doc.name)
bean = frappe.bean("Event", doc.name)
if len(bean.doclist)==1:
return False
if bean.doclist.get({"doctype":"Event User", "person":webnotes.session.user}):
if bean.doclist.get({"doctype":"Event User", "person":frappe.session.user}):
return True
if bean.doclist.get({"doctype":"Event Role", "role":("in", webnotes.get_roles())}):
if bean.doclist.get({"doctype":"Event Role", "role":("in", frappe.get_roles())}):
return True
return False
@ -49,33 +49,33 @@ def has_permission(doc):
def send_event_digest():
today = nowdate()
for user in webnotes.conn.sql("""select name, email, language
for user in frappe.conn.sql("""select name, email, language
from tabProfile where ifnull(enabled,0)=1
and user_type='System User' and name not in ('Guest', 'Administrator')""", as_dict=1):
events = get_events(today, today, user.name, for_reminder=True)
if events:
text = ""
webnotes.set_user_lang(user.name, user.language)
frappe.set_user_lang(user.name, user.language)
text = "<h3>" + webnotes._("Events In Today's Calendar") + "</h3>"
text = "<h3>" + frappe._("Events In Today's Calendar") + "</h3>"
for e in events:
if e.all_day:
e.starts_on = "All Day"
text += "<h4>%(starts_on)s: %(subject)s</h4><p>%(description)s</p>" % e
text += '<p style="color: #888; font-size: 80%; margin-top: 20px; padding-top: 10px; border-top: 1px solid #eee;">'\
+ webnotes._("Daily Event Digest is sent for Calendar Events where reminders are set.")+'</p>'
+ frappe._("Daily Event Digest is sent for Calendar Events where reminders are set.")+'</p>'
from webnotes.utils.email_lib import sendmail
sendmail(recipients=user.email, subject=webnotes._("Upcoming Events for Today"),
from frappe.utils.email_lib import sendmail
sendmail(recipients=user.email, subject=frappe._("Upcoming Events for Today"),
msg = text)
@webnotes.whitelist()
@frappe.whitelist()
def get_events(start, end, user=None, for_reminder=False):
if not user:
user = webnotes.session.user
roles = webnotes.get_roles(user)
events = webnotes.conn.sql("""select name, subject, description,
user = frappe.session.user
roles = frappe.get_roles(user)
events = frappe.conn.sql("""select name, subject, description,
starts_on, ends_on, owner, all_day, event_type, repeat_this_event, repeat_on,
monday, tuesday, wednesday, thursday, friday, saturday, sunday
from tabEvent where ((

View file

@ -1,4 +1,4 @@
wn.views.calendar["Event"] = {
frappe.views.calendar["Event"] = {
field_map: {
"start": "starts_on",
"end": "ends_on",
@ -11,5 +11,5 @@ wn.views.calendar["Event"] = {
"Public": "success",
"Private": "info"
},
get_events_method: "webnotes.core.doctype.event.event.get_events"
get_events_method: "frappe.core.doctype.event.event.get_events"
}

View file

@ -29,36 +29,36 @@ test_records = [
]
import webnotes
import webnotes.defaults
import frappe
import frappe.defaults
import unittest
class TestEvent(unittest.TestCase):
# def setUp(self):
# profile = webnotes.bean("Profile", "test1@example.com")
# profile = frappe.bean("Profile", "test1@example.com")
# profile.get_controller().add_roles("Website Manager")
def tearDown(self):
webnotes.set_user("Administrator")
frappe.set_user("Administrator")
def test_allowed_public(self):
webnotes.set_user("test1@example.com")
doc = webnotes.doc("Event", webnotes.conn.get_value("Event", {"subject":"_Test Event 1"}))
self.assertTrue(webnotes.has_permission("Event", refdoc=doc))
frappe.set_user("test1@example.com")
doc = frappe.doc("Event", frappe.conn.get_value("Event", {"subject":"_Test Event 1"}))
self.assertTrue(frappe.has_permission("Event", refdoc=doc))
def test_not_allowed_private(self):
webnotes.set_user("test1@example.com")
doc = webnotes.doc("Event", webnotes.conn.get_value("Event", {"subject":"_Test Event 2"}))
self.assertFalse(webnotes.has_permission("Event", refdoc=doc))
frappe.set_user("test1@example.com")
doc = frappe.doc("Event", frappe.conn.get_value("Event", {"subject":"_Test Event 2"}))
self.assertFalse(frappe.has_permission("Event", refdoc=doc))
def test_allowed_private_if_in_event_user(self):
webnotes.set_user("test1@example.com")
doc = webnotes.doc("Event", webnotes.conn.get_value("Event", {"subject":"_Test Event 3"}))
self.assertTrue(webnotes.has_permission("Event", refdoc=doc))
frappe.set_user("test1@example.com")
doc = frappe.doc("Event", frappe.conn.get_value("Event", {"subject":"_Test Event 3"}))
self.assertTrue(frappe.has_permission("Event", refdoc=doc))
def test_event_list(self):
webnotes.set_user("test1@example.com")
res = webnotes.get_list("Event", filters=[["Event", "subject", "like", "_Test Event%"]], fields=["name", "subject"])
frappe.set_user("test1@example.com")
res = frappe.get_list("Event", filters=[["Event", "subject", "like", "_Test Event%"]], fields=["name", "subject"])
self.assertEquals(len(res), 2)
subjects = [r.subject for r in res]
self.assertTrue("_Test Event 1" in subjects)

View file

@ -2,7 +2,7 @@
# MIT License. See license.txt
from __future__ import unicode_literals
import webnotes
import frappe
class DocType:
def __init__(self, d, dl):

View file

@ -2,7 +2,7 @@
# MIT License. See license.txt
from __future__ import unicode_literals
import webnotes
import frappe
class DocType:
def __init__(self, d, dl):

View file

@ -8,19 +8,19 @@ record of files
naming for same name files: file.gif, file-1.gif, file-2.gif etc
"""
import webnotes, webnotes.utils, os
from webnotes import conf
import frappe, frappe.utils, os
from frappe import conf
class DocType():
def __init__(self, d, dl):
self.doc, self.doclist = d, dl
def before_insert(self):
webnotes.local.rollback_observers.append(self)
frappe.local.rollback_observers.append(self)
def on_update(self):
# check duplicate assignement
n_records = webnotes.conn.sql("""select name from `tabFile Data`
n_records = frappe.conn.sql("""select name from `tabFile Data`
where file_name=%s
and name!=%s
and attached_to_doctype=%s
@ -28,28 +28,28 @@ class DocType():
self.doc.attached_to_name))
if len(n_records) > 0:
self.doc.duplicate_entry = n_records[0][0]
webnotes.msgprint(webnotes._("Same file has already been attached to the record"))
webnotes.conn.rollback()
raise webnotes.DuplicateEntryError
frappe.msgprint(frappe._("Same file has already been attached to the record"))
frappe.conn.rollback()
raise frappe.DuplicateEntryError
def on_trash(self):
if self.doc.attached_to_name:
# check persmission
try:
if not webnotes.has_permission(self.doc.attached_to_doctype,
if not frappe.has_permission(self.doc.attached_to_doctype,
"write", self.doc.attached_to_name):
webnotes.msgprint(webnotes._("No permission to write / remove."),
frappe.msgprint(frappe._("No permission to write / remove."),
raise_exception=True)
except webnotes.DoesNotExistError:
except frappe.DoesNotExistError:
pass
# if file not attached to any other record, delete it
if self.doc.file_name and not webnotes.conn.count("File Data",
if self.doc.file_name and not frappe.conn.count("File Data",
{"file_name": self.doc.file_name, "name": ["!=", self.doc.name]}):
if self.doc.file_name.startswith("files/"):
path = webnotes.utils.get_site_path("public", self.doc.file_name)
path = frappe.utils.get_site_path("public", self.doc.file_name)
else:
path = webnotes.utils.get_site_path("public", "files", self.doc.file_name)
path = frappe.utils.get_site_path("public", "files", self.doc.file_name)
if os.path.exists(path):
os.remove(path)

View file

@ -4,8 +4,8 @@
cur_frm.cscript.refresh = function(doc) {
cur_frm.set_intro("");
if(doc.__islocal) {
cur_frm.set_intro(wn._("Step 1: Set the name and save."));
cur_frm.set_intro(frappe._("Step 1: Set the name and save."));
} else if(!cur_frm.doc.content) {
cur_frm.set_intro(wn._("Step 2: Set Letterhead content."));
cur_frm.set_intro(frappe._("Step 2: Set Letterhead content."));
}
}

View file

@ -2,7 +2,7 @@
# MIT License. See license.txt
from __future__ import unicode_literals
import webnotes
import frappe
class DocType:
@ -14,17 +14,17 @@ class DocType:
self.set_as_default()
# clear the cache so that the new letter head is uploaded
webnotes.clear_cache()
frappe.clear_cache()
def set_as_default(self):
from webnotes.utils import set_default
from frappe.utils import set_default
if not self.doc.is_default:
if not webnotes.conn.sql("""select count(*) from `tabLetter Head` where ifnull(is_default,0)=1"""):
if not frappe.conn.sql("""select count(*) from `tabLetter Head` where ifnull(is_default,0)=1"""):
self.doc.is_default = 1
if self.doc.is_default:
webnotes.conn.sql("update `tabLetter Head` set is_default=0 where name != %s",
frappe.conn.sql("update `tabLetter Head` set is_default=0 where name != %s",
self.doc.name)
set_default('letter_head', self.doc.name)
# update control panel - so it loads new letter directly
webnotes.conn.set_value('Control Panel', None, 'letter_head', self.doc.content)
frappe.conn.set_value('Control Panel', None, 'letter_head', self.doc.content)

Some files were not shown because too many files have changed in this diff Show more