def get_context(context): blog_post = context.doc # this is for double precaution. usually it wont reach this code if not published if not cint(blog_post.published): raise Exception, "This blog has not been published yet!" # temp fields blog_post.full_name = get_fullname(blog_post.owner) blog_post.updated = global_date_format(blog_post.published_on) if blog_post.blogger: blog_post.blogger_info = frappe.get_doc("Blogger", blog_post.blogger).as_dict() blog_post.description = blog_post.blog_intro or blog_post.content[:140] blog_post.metatags = { "name": blog_post.title, "description": blog_post.description, } image = find_first_image(blog_post.content) if image: blog_post.metatags["image"] = image blog_post.categories = frappe.db.sql_list("select name from `tabBlog Category` order by name") blog_post.comment_list = frappe.db.sql("""\ select comment, comment_by_fullname, creation from `tabComment` where comment_doctype="Blog Post" and comment_docname=%s order by creation""", (blog_post.name,), as_dict=1) or [] return blog_post.__dict__
def get_context(self, context): # this is for double precaution. usually it wont reach this code if not published if not cint(self.published): raise Exception, "This blog has not been published yet!" # temp fields context.full_name = get_fullname(self.owner) context.updated = global_date_format(self.published_on) if self.blogger: context.blogger_info = frappe.get_doc("Blogger", self.blogger).as_dict() context.description = self.blog_intro or self.content[:140] context.metatags = { "name": self.title, "description": context.description, } image = find_first_image(self.content) if image: context.metatags["image"] = image context.categories = frappe.db.sql_list("""select name from `tabBlog Category` order by name""") context.comment_list = get_comment_list(self.doctype, self.name) context.children = get_children() return context
def get_blog_list(start=0, by=None, category=None): condition = "" if by: condition = " and t1.blogger='%s'" % by.replace("'", "\'") if category: condition += " and t1.blog_category='%s'" % category.replace("'", "\'") query = """\ select t1.title, t1.name, t3.name as page_name, t1.published_on as creation, day(t1.published_on) as day, monthname(t1.published_on) as month, year(t1.published_on) as year, ifnull(t1.blog_intro, t1.content) as content, t2.full_name, t2.avatar, t1.blogger, (select count(name) from `tabComment` where comment_doctype='Blog Post' and comment_docname=t1.name) as comments from `tabBlog Post` t1, `tabBlogger` t2, `tabWebsite Route` t3 where ifnull(t1.published,0)=1 and t1.blogger = t2.name and t3.docname = t1.name and t3.ref_doctype = "Blog Post" %(condition)s order by published_on desc, name asc limit %(start)s, 20""" % {"start": start, "condition": condition} result = frappe.db.sql(query, as_dict=1) # strip html tags from content for res in result: res['published'] = global_date_format(res['creation']) res['content'] = res['content'][:140] return result
def get_message_details(self): '''Return args for template''' dws_group = frappe.get_doc('Daily Work Summary Group', self.daily_work_summary_group) replies = frappe.get_all('Communication', fields=['content', 'text_content', 'sender'], filters=dict( reference_doctype=self.doctype, reference_name=self.name, communication_type='Communication', sent_or_received='Received'), order_by='creation asc') did_not_reply = self.email_sent_to.split() for d in replies: user = frappe.db.get_values("User", {"email": d.sender}, ["full_name", "user_image"], as_dict=True) d.sender_name = user[0].full_name if user else d.sender d.image = user[0].image if user and user[0].image else None original_image = d.image # make thumbnail image try: if original_image: file_name = frappe.get_list('File', {'file_url': original_image}) if file_name: file_name = file_name[0].name file_doc = frappe.get_doc('File', file_name) thumbnail_image = file_doc.make_thumbnail( set_as_thumbnail=False, width=100, height=100, crop=True) d.image = thumbnail_image except: d.image = original_image if d.sender in did_not_reply: did_not_reply.remove(d.sender) if d.text_content: d.content = frappe.utils.md_to_html( EmailReplyParser.parse_reply(d.text_content)) did_not_reply = [ (frappe.db.get_value("User", {"email": email}, "full_name") or email) for email in did_not_reply ] return dict(replies=replies, original_message=dws_group.message, title=_('Work Summary for {0}'.format( global_date_format(self.creation))), did_not_reply=', '.join(did_not_reply) or '', did_not_reply_title=_('No replies from'))
def get_context(self, context): # this is for double precaution. usually it wont reach this code if not published if not cint(self.published): raise Exception, "This blog has not been published yet!" # temp fields context.full_name = get_fullname(self.owner) context.updated = global_date_format(self.published_on) if self.blogger: context.blogger_info = frappe.get_doc("Blogger", self.blogger).as_dict() context.description = self.blog_intro or self.content[:140] context.metatags = { "name": self.title, "description": context.description, } image = find_first_image(self.content) if image: context.metatags["image"] = image context.categories = frappe.db.sql_list("""select name from `tabBlog Category` order by name""") context.comment_list = get_comment_list(self.doctype, self.name) return context
def get_context(self, context): # this is for double precaution. usually it wont reach this code if not published if not cint(self.published): raise Exception, "This blog has not been published yet!" # temp fields context.full_name = get_fullname(self.owner) context.updated = global_date_format(self.published_on) if self.blogger: context.blogger_info = frappe.get_doc("Blogger", self.blogger).as_dict() context.description = self.blog_intro or self.content[:140] context.metatags = { "name": self.title, "description": context.description, } if "<!-- markdown -->" in context.content: context.content = markdown(context.content) image = find_first_image(self.content) if image: context.metatags["image"] = image context.comment_list = get_comment_list(self.doctype, self.name) context.children = get_children() category = frappe.db.get_value("Blog Category", context.doc.blog_category, ["title", "page_name"], as_dict=1) context.parents = [{"title": category.title, "name": "blog/{0}".format(category.page_name)}]
def get_message_details(self): '''Return args for template''' settings = frappe.get_doc('Daily Work Summary Settings') replies = frappe.get_all('Communication', fields=['content', 'text_content', 'sender'], filters=dict(reference_doctype=self.doctype, reference_name=self.name, communication_type='Communication', sent_or_received='Received'), order_by='creation asc') did_not_reply = self.email_sent_to.split() for d in replies: emp = frappe.db.get_values("Employee", {"user_id": d.sender}, ["employee_name", "image"], as_dict=True) d.sender_name = emp[0].employee_name if emp else d.sender d.image = emp[0].image if emp and emp[0].image else None if d.sender in did_not_reply: did_not_reply.remove(d.sender) if d.text_content: d.content = markdown(EmailReplyParser.parse_reply(d.text_content)) did_not_reply = [(frappe.db.get_value("Employee", {"user_id": email}, "employee_name") or email) for email in did_not_reply] return dict(replies=replies, original_message=settings.message, title=_('Daily Work Summary for {0}'.format(global_date_format(self.creation))), did_not_reply= ', '.join(did_not_reply) or '', did_not_reply_title = _('No replies from'))
def get_blog_list(doctype, txt=None, filters=None, limit_start=0, limit_page_length=20): conditions = [] if filters: if filters.by: conditions.append('t1.blogger="%s"' % frappe.db.escape(filters.by)) if filters.category: conditions.append( 't1.blog_category="%s"' % frappe.db.escape(get_blog_category(filters.category))) if txt: conditions.append('t1.content like "%{0}%"'.format( frappe.db.escape(txt))) if conditions: frappe.local.no_cache = 1 query = """\ select t1.title, t1.name, t1.blog_category, t1.parent_website_route, t1.published_on, concat(t1.parent_website_route, "/", t1.page_name) as page_name, t1.published_on as creation, ifnull(t1.blog_intro, t1.content) as content, t2.full_name, t2.avatar, t1.blogger, (select count(name) from `tabComment` where comment_doctype='Blog Post' and comment_docname=t1.name and comment_type="Comment") as comments from `tabBlog Post` t1, `tabBlogger` t2 where ifnull(t1.published,0)=1 and t1.blogger = t2.name %(condition)s order by published_on desc, name asc limit %(start)s, %(page_len)s""" % { "start": limit_start, "page_len": limit_page_length, "condition": (" and " + " and ".join(conditions)) if conditions else "" } posts = frappe.db.sql(query, as_dict=1) for post in posts: post.published = global_date_format(post.creation) post.content = strip_html_tags(post.content[:140]) if not post.comments: post.comment_text = _('No comments yet') elif post.comments == 1: post.comment_text = _('1 comment') else: post.comment_text = _('{0} comments').format(str(post.comments)) post.avatar = post.avatar or "" if (not "http:" in post.avatar or "https:" in post.avatar) and not post.avatar.startswith("/"): post.avatar = "/" + post.avatar return posts
def get_html_table(self, columns=None, data=None): date_time = global_date_format(now()) + " " + format_time(now()) report_doctype = frappe.db.get_value("Report", self.report, "ref_doctype") return frappe.render_template( "frappe/templates/emails/auto_email_report.html", { "title": self.name, "description": self.description, "date_time": date_time, "columns": columns, "data": data, "report_url": get_url_to_report(self.report, self.report_type, report_doctype), "report_name": self.report, "edit_report_settings": get_link_to_form("Auto Email Report", self.name), }, )
def get_context(context): blog_post = context.bean.doc # this is for double precaution. usually it wont reach this code if not published if not cint(blog_post.published): raise Exception, "This blog has not been published yet!" # temp fields blog_post.full_name = get_fullname(blog_post.owner) blog_post.updated = global_date_format(blog_post.published_on) if blog_post.blogger: blog_post.blogger_info = frappe.doc("Blogger", blog_post.blogger).fields blog_post.description = blog_post.blog_intro or blog_post.content[:140] blog_post.meta_description = blog_post.description blog_post.categories = frappe.db.sql_list("select name from `tabBlog Category` order by name") blog_post.comment_list = frappe.db.sql("""\ select comment, comment_by_fullname, creation from `tabComment` where comment_doctype="Blog Post" and comment_docname=%s order by creation""", (blog_post.name,), as_dict=1) or [] return blog_post.fields
def get_html_table(self, columns=None, data=None): date_time = global_date_format(now()) + ' ' + format_time(now()) report_doctype = frappe.db.get_value('Report', self.report, 'ref_doctype') return frappe.render_template( 'frappe/templates/emails/auto_email_report.html', { 'title': self.name, 'description': self.description, 'date_time': date_time, 'columns': columns, 'data': data, 'report_url': frappe.utils.get_url_to_report(self.report, self.report_type, report_doctype), 'report_name': self.report, 'edit_report_settings': frappe.utils.get_link_to_form('Auto Email Report', self.name) })
def get_context(self, context): # this is for double precaution. usually it wont reach this code if not published if not cint(self.published): raise Exception("This blog has not been published yet!") # temp fields context.full_name = get_fullname(self.owner) context.updated = global_date_format(self.published_on) if self.blogger: context.blogger_info = frappe.get_doc("Blogger", self.blogger).as_dict() context.author = self.blogger context.content = get_html_content_based_on_type(self, 'content', self.content_type) context.description = self.blog_intro or strip_html_tags(context.content[:140]) context.metatags = { "name": self.title, "description": context.description, } image = find_first_image(context.content) if image: context.metatags["image"] = image self.load_comments(context) context.category = frappe.db.get_value("Blog Category", context.doc.blog_category, ["title", "route"], as_dict=1) context.parents = [{"name": _("Home"), "route":"/"}, {"name": "Blog", "route": "/blog"}, {"label": context.category.title, "route":context.category.route}]
def send_shopfloor_activities_summary_report(): """ Similar to auto_email_report.send(), but renders the report in to a jinja template to allow for more flexibility """ # Get auto email report auto_email_report = frappe.get_doc( "Auto Email Report", "Horizon Global (PTA): Shopfloor Activities Summary") report = frappe.get_doc('Report', auto_email_report.report) # Get report content columns, data = report.get_data(limit=auto_email_report.no_of_rows or 100, user=auto_email_report.user, filters=auto_email_report.filters, as_dict=True) # Render template date_time = global_date_format(now()) + ' ' + format_time(now()) report_doctype = frappe.db.get_value('Report', auto_email_report.report, 'ref_doctype') report_html_data = frappe.render_template( 'quality_management_system/process/report/shopfloor_activities_summary/shopfloor_activities_summary_jinja.html', { 'title': auto_email_report.name, 'description': auto_email_report.description, 'date_time': date_time, 'columns': columns, 'data': data, 'report_url': get_url_to_report(auto_email_report.report, auto_email_report.report_type, report_doctype), 'report_name': auto_email_report.report, 'edit_report_settings': get_link_to_form('Auto Email Report', auto_email_report.name), 'site_url': get_url() }) # Later for testing: create PDF and attach # file_name = "test_dirk7.html" # from frappe.utils.file_manager import save_file # my_file = save_file(file_name, report_html_data, "Workstation", # "MagnaFlux Machine", "Home/Attachments") # Send email, according to Auto Email Report settings attachments = None message = report_html_data frappe.sendmail(recipients=auto_email_report.email_to.split(), subject=auto_email_report.name, message=message, attachments=attachments, reference_doctype=auto_email_report.doctype, reference_name=auto_email_report.name)
def get_message_details(self): """Return args for template""" dws_group = frappe.get_doc("Daily Work Summary Group", self.daily_work_summary_group) replies = frappe.get_all( "Communication", fields=["content", "text_content", "sender"], filters=dict( reference_doctype=self.doctype, reference_name=self.name, communication_type="Communication", sent_or_received="Received", ), order_by="creation asc", ) did_not_reply = self.email_sent_to.split() for d in replies: user = frappe.db.get_values( "User", {"email": d.sender}, ["full_name", "user_image"], as_dict=True ) d.sender_name = user[0].full_name if user else d.sender d.image = user[0].image if user and user[0].image else None original_image = d.image # make thumbnail image try: if original_image: file_name = frappe.get_list("File", {"file_url": original_image}) if file_name: file_name = file_name[0].name file_doc = frappe.get_doc("File", file_name) thumbnail_image = file_doc.make_thumbnail( set_as_thumbnail=False, width=100, height=100, crop=True ) d.image = thumbnail_image except Exception: d.image = original_image if d.sender in did_not_reply: did_not_reply.remove(d.sender) if d.text_content: d.content = frappe.utils.md_to_html(EmailReplyParser.parse_reply(d.text_content)) did_not_reply = [ (frappe.db.get_value("User", {"email": email}, "full_name") or email) for email in did_not_reply ] return dict( replies=replies, original_message=dws_group.message, title=_("Work Summary for {0}").format(global_date_format(self.creation)), did_not_reply=", ".join(did_not_reply) or "", did_not_reply_title=_("No replies from"), )
def get_blog_list(doctype, txt=None, filters=None, limit_start=0, limit_page_length=20, order_by=None): conditions = [] if filters: if filters.blogger: conditions.append('t1.blogger="%s"' % frappe.db.escape(filters.blogger)) if filters.blog_category: conditions.append('t1.blog_category="%s"' % frappe.db.escape(filters.blog_category)) if txt: conditions.append('(t1.content like "%{0}%" or t1.title like "%{0}%")'.format(frappe.db.escape(txt))) if conditions: frappe.local.no_cache = 1 query = """\ select t1.title, t1.name, t1.blog_category, t1.route, t1.published_on, t1.published_on as creation, t1.content as content, ifnull(t1.blog_intro, t1.content) as intro, t2.full_name, t2.avatar, t1.blogger, (select count(name) from `tabCommunication` where communication_type='Comment' and comment_type='Comment' and reference_doctype='Blog Post' and reference_name=t1.name) as comments from `tabBlog Post` t1, `tabBlogger` t2 where ifnull(t1.published,0)=1 and t1.blogger = t2.name %(condition)s order by published_on desc, name asc limit %(start)s, %(page_len)s""" % { "start": limit_start, "page_len": limit_page_length, "condition": (" and " + " and ".join(conditions)) if conditions else "" } posts = frappe.db.sql(query, as_dict=1) for post in posts: post.cover_image = find_first_image(post.content) post.published = global_date_format(post.creation) post.content = strip_html_tags(post.content[:340]) if not post.comments: post.comment_text = _('No comments yet') elif post.comments==1: post.comment_text = _('1 comment') else: post.comment_text = _('{0} comments').format(str(post.comments)) post.avatar = post.avatar or "" post.category = frappe.db.get_value('Blog Category', post.blog_category, ['route', 'title'], as_dict=True) if post.avatar and (not "http:" in post.avatar and not "https:" in post.avatar) and not post.avatar.startswith("/"): post.avatar = "/" + post.avatar return posts
def get_blog_list(doctype, txt=None, filters=None, limit_start=0, limit_page_length=20, order_by=None): conditions = [] if filters: if filters.blogger: conditions.append('t1.blogger=%s' % frappe.db.escape(filters.blogger)) if filters.blog_category: conditions.append('t1.blog_category=%s' % frappe.db.escape(filters.blog_category)) if txt: conditions.append('(t1.content like {0} or t1.title like {0}")'.format(frappe.db.escape('%' + txt + '%'))) if conditions: frappe.local.no_cache = 1 query = """\ select t1.title, t1.name, t1.blog_category, t1.route, t1.published_on, t1.published_on as creation, t1.content as content, ifnull(t1.blog_intro, t1.content) as intro, t2.full_name, t2.avatar, t1.blogger, (select count(name) from `tabComment` where and comment_type='Comment' and reference_doctype='Blog Post' and reference_name=t1.name) as comments from `tabBlog Post` t1, `tabBlogger` t2 where ifnull(t1.published,0)=1 and t1.blogger = t2.name %(condition)s order by published_on desc, name asc limit %(start)s, %(page_len)s""" % { "start": limit_start, "page_len": limit_page_length, "condition": (" and " + " and ".join(conditions)) if conditions else "" } posts = frappe.db.sql(query, as_dict=1) for post in posts: post.cover_image = find_first_image(post.content) post.published = global_date_format(post.creation) post.content = strip_html_tags(post.content[:340]) if not post.comments: post.comment_text = _('No comments yet') elif post.comments==1: post.comment_text = _('1 comment') else: post.comment_text = _('{0} comments').format(str(post.comments)) post.avatar = post.avatar or "" post.category = frappe.db.get_value('Blog Category', post.blog_category, ['route', 'title'], as_dict=True) if post.avatar and (not "http:" in post.avatar and not "https:" in post.avatar) and not post.avatar.startswith("/"): post.avatar = "/" + post.avatar return posts
def get_context(self, context): # this is for double precaution. usually it wont reach this code if not published if not cint(self.published): raise Exception("This blog has not been published yet!") # temp fields context.full_name = get_fullname(self.owner) context.updated = global_date_format(self.published_on) if self.blogger: context.blogger_info = frappe.get_doc("Blogger", self.blogger).as_dict() context.description = self.blog_intro or self.content[:140] context.metatags = { "name": self.title, "description": context.description, } if "<!-- markdown -->" in context.content: context.content = markdown(context.content) blog_settings = frappe.get_doc('Blog Settings', 'Blog Settings') context.enable_comments = blog_settings.enable_comments context.enable_blogger_info = blog_settings.enable_blogger_info image = find_first_image(self.content) if image: context.metatags["image"] = image context.comment_list = get_comment_list(self.doctype, self.name) if not context.comment_list: context.comment_text = _('No comments yet') else: if (len(context.comment_list)) == 1: context.comment_text = _('1 comment') else: context.comment_text = _('{0} comments').format( len(context.comment_list)) context.category = frappe.db.get_value("Blog Category", context.doc.blog_category, ["title", "route"], as_dict=1) context.parents = [{ "name": _("Home"), "route": "/" }, { "name": "Blog", "route": "/blog" }, { "label": context.category.title, "route": context.category.route }]
def get_context(self, context): # this is for double precaution. usually it wont reach this code if not published if not cint(self.published): raise Exception("This blog has not been published yet!") context.no_breadcrumbs = True # temp fields context.full_name = get_fullname(self.owner) context.updated = global_date_format(self.published_on) context.social_links = self.fetch_social_links_info() context.cta = self.fetch_cta() context.enable_cta = not self.hide_cta and frappe.db.get_single_value( "Blog Settings", "show_cta_in_blog", cache=True) if self.blogger: context.blogger_info = frappe.get_doc("Blogger", self.blogger).as_dict() context.author = self.blogger context.content = get_html_content_based_on_type( self, 'content', self.content_type) #if meta description is not present, then blog intro or first 140 characters of the blog will be set as description context.description = self.meta_description or self.blog_intro or strip_html_tags( context.content[:140]) context.metatags = { "name": self.meta_title, "description": context.description, } #if meta image is not present, then first image inside the blog will be set as the meta image image = find_first_image(context.content) context.metatags["image"] = self.meta_image or image or None self.load_comments(context) self.load_feedback(context) context.category = frappe.db.get_value("Blog Category", context.doc.blog_category, ["title", "route"], as_dict=1) context.parents = [{ "name": _("Home"), "route": "/" }, { "name": "Blog", "route": "/blog" }, { "label": context.category.title, "route": context.category.route }] context.guest_allowed = True
def get_blog_list(doctype, txt=None, filters=None, limit_start=0, limit_page_length=20): conditions = [] if filters: if filters.by: conditions.append('t1.blogger="%s"' % frappe.db.escape(filters.by)) if filters.category: conditions.append('t1.blog_category="%s"' % frappe.db.escape(get_blog_category(filters.category))) if txt: conditions.append('t1.content like "%{0}%"'.format(frappe.db.escape(txt))) if conditions: frappe.local.no_cache = 1 query = """\ select t1.title, t1.name, t1.blog_category, t1.parent_website_route, t1.published_on, concat(t1.parent_website_route, "/", t1.page_name) as page_name, t1.published_on as creation, ifnull(t1.blog_intro, t1.content) as content, t2.full_name, t2.avatar, t1.blogger, (select count(name) from `tabComment` where comment_doctype='Blog Post' and comment_docname=t1.name and comment_type="Comment") as comments from `tabBlog Post` t1, `tabBlogger` t2 where ifnull(t1.published,0)=1 and t1.blogger = t2.name %(condition)s order by published_on desc, name asc limit %(start)s, %(page_len)s""" % { "start": limit_start, "page_len": limit_page_length, "condition": (" and " + " and ".join(conditions)) if conditions else "" } posts = frappe.db.sql(query, as_dict=1) for post in posts: post.published = global_date_format(post.creation) post.content = strip_html_tags(post.content[:140]) if not post.comments: post.comment_text = _('No comments yet') elif post.comments==1: post.comment_text = _('1 comment') else: post.comment_text = _('{0} comments').format(str(post.comments)) post.avatar = post.avatar or "" if (not "http:" in post.avatar or "https:" in post.avatar) and not post.avatar.startswith("/"): post.avatar = "/" + post.avatar return posts
def get_html_table(self, columns=None, data=None): date_time = global_date_format(now()) + ' ' + format_time(now()) report_doctype = frappe.db.get_value('Report', self.report, 'ref_doctype') return frappe.render_template('frappe/templates/emails/auto_email_report.html', { 'title': self.name, 'description': self.description, 'date_time': date_time, 'columns': columns, 'data': data, 'report_url': get_url_to_report(self.report, self.report_type, report_doctype), 'report_name': self.report, 'edit_report_settings': get_link_to_form('Auto Email Report', self.name) })
def get_data(category=None,user=None,page_no=0,limit=3): """Returns processed HTML page for a standard listing.""" conditions = [] if page_no: offset = (cint(page_no) * cint(limit)) else: offset = 0 #next_start = cint(limit_start) + cint(limit_page_length) if user: conditions.append('t1.post_by="%s"' % frappe.db.escape(user)) if category: conditions.append('t1.blog_category="%s"' % frappe.db.escape(category)) limit_query = " limit %(start)s offset %(page_len)s"%{"start": limit, "page_len":offset } query = """\ select t1.title, t1.name, t1.blog_category, t1.published_on, t1.published_on as creation, ifnull(t1.intro, t1.content) as content, t2.employee_name,t1.post_by, (select count(name) from `tabComment` where comment_doctype='Discussion Topic' and comment_docname=t1.name and comment_type="Comment") as comments from `tabDiscussion Topic` t1, `tabEmployee` t2 where ifnull(t1.published,0)=1 and t1.post_by = t2.name %(condition)s order by published_on desc, name asc""" % { "condition": (" and " + " and ".join(conditions)) if conditions else "" } posts = frappe.db.sql(query+ limit_query, as_dict=1) for post in posts: post.published = global_date_format(post.creation) post.content = strip_html_tags(post.content[:140]) post.assigned = check_if_assigned(post) if not post.comments: post.comment_text = _('No comments yet') elif post.comments==1: post.comment_text = _('1 comment') else: post.comment_text = _('{0} comments').format(str(post.comments)) total_records = get_total_topics(conditions) paginate = True if total_records > limit else False total_pages = math.ceil(total_records/flt(limit)) return posts,total_pages,int(page_no)+1,paginate if posts else {}
def get_context(self, context): # this is for double precaution. usually it wont reach this code if not published if not cint(self.published): raise Exception("This blog has not been published yet!") # temp fields context.full_name = get_fullname(self.owner) context.updated = global_date_format(self.published_on) if self.blogger: context.blogger_info = frappe.get_doc("Blogger", self.blogger).as_dict() context.description = self.blog_intro or self.content[:140] context.metatags = { "name": self.title, "description": context.description, } if "<!-- markdown -->" in context.content: context.content = markdown(context.content) image = find_first_image(self.content) if image: context.metatags["image"] = image context.comment_list = get_comment_list(self.doctype, self.name) if not context.comment_list: context.comment_text = _('No comments yet') else: if(len(context.comment_list)) == 1: context.comment_text = _('1 comment') else: context.comment_text = _('{0} comments').format(len(context.comment_list)) context.category = frappe.db.get_value("Blog Category", context.doc.blog_category, ["title", "route"], as_dict=1) context.parents = [{"name": _("Home"), "route":"/"}, {"name": "Blog", "route": "/blog"}, {"label": context.category.title, "route":context.category.route}]
def get_collections(date_range, driver, show_individual_stops=False): data = [] filters = {"departure_time": ["between", date_range], "docstatus": 1} if driver: filters["driver"] = driver delivery_trips = frappe.get_all("Delivery Trip", filters=filters) for trip in delivery_trips: delivery_trip = frappe.get_doc("Delivery Trip", trip.name) sales_invoices = [] delivery_amount = tax_amount = promotional_amount = unprocessed_amount = processed_amount = paid_amount = returned_amount = cancelled_amount = 0.0 for stop in delivery_trip.delivery_stops: if stop.delivery_note: # Base amounts discount_stop_amount = promotional_stop_amount = 0.0 is_promotional_delivery = frappe.db.get_value( "Delivery Note", stop.delivery_note, "order_type") == "Promotional" if stop.grand_total == 0: discount_stop_amount = frappe.db.get_value( "Delivery Note", stop.delivery_note, "discount_amount") if is_promotional_delivery: promotional_stop_amount = discount_stop_amount # TODO: Replace promotional amount with full discount, and breakdown each # discount as a separate column, if D9 wants to delivery_stop_amount = stop.grand_total + promotional_stop_amount amount_under_terms = get_amount_under_terms(stop.sales_invoice) tax_stop_amount = get_tax_amount( stop.sales_invoice) if stop.sales_invoice else 0.0 # Paid amounts unprocessed_stop_amount = get_paid_amount(stop.sales_invoice, stop.delivery_note, docstatus=0) processed_stop_amount = get_paid_amount(stop.sales_invoice, stop.delivery_note, docstatus=1) paid_stop_amount = unprocessed_stop_amount + processed_stop_amount # Returned amounts returned_stop_amount = abs( frappe.db.get_value( "Delivery Note", { "docstatus": 1, "return_against": stop.delivery_note, "issue_credit_note": 0 }, "sum(grand_total)") or 0) cancelled_stop_amount = abs( frappe.db.get_value( "Delivery Note", { "docstatus": 1, "return_against": stop.delivery_note, "issue_credit_note": 1 }, "sum(grand_total)") or 0) if driver or show_individual_stops: # Append individual driver collections data.append({ "driver": delivery_trip.driver_name, "delivery_trip": trip.name, "delivery_date": global_date_format(delivery_trip.departure_time), "sales_invoices": stop.sales_invoice, "customer": stop.customer, "total_amount": delivery_stop_amount, "tax_amount": tax_stop_amount, "promotional_amount": promotional_stop_amount, "amount_under_terms": amount_under_terms, "cancelled_amount": cancelled_stop_amount, "expected_amount": stop.grand_total - amount_under_terms - cancelled_stop_amount, "returned_amount": returned_stop_amount, "payment_received": unprocessed_stop_amount, "payment_processed": processed_stop_amount, "total_payment": paid_stop_amount }) else: delivery_amount += delivery_stop_amount tax_amount += tax_stop_amount promotional_amount += promotional_stop_amount returned_amount += returned_stop_amount cancelled_amount += cancelled_stop_amount unprocessed_amount += unprocessed_stop_amount processed_amount += processed_stop_amount paid_amount += paid_stop_amount if stop.sales_invoice: sales_invoices.append(stop.sales_invoice) if not driver and not show_individual_stops: # Append cumulative collections for each Trip amount_under_terms = get_amount_under_terms(sales_invoices) sales_invoices = ", ".join(sales_invoices) data.append({ "driver": delivery_trip.driver_name, "delivery_trip": trip.name, "delivery_date": global_date_format(delivery_trip.departure_time), "sales_invoices": sales_invoices, "total_amount": delivery_amount, "tax_amount": tax_amount, "promotional_amount": promotional_amount, "amount_under_terms": amount_under_terms, "cancelled_amount": cancelled_amount, "expected_amount": delivery_trip.package_total - amount_under_terms - cancelled_amount, "returned_amount": returned_amount, "payment_received": unprocessed_amount, "payment_processed": processed_amount, "total_payment": paid_amount }) return data
def get_report_content(company, customer_name, from_date=None, to_date=None): """Returns html for the report in PDF format""" settings_doc = frappe.get_single("Customer Statements Sender") if not from_date: from_date = get_first_day(today()).strftime("%Y-%m-%d") if not to_date: to_date = today() # Get General Ledger report content report_gl = frappe.get_doc("Report", "General Ledger") report_gl_filters = { "company": company, "party_type": "Customer", "party": [customer_name], "from_date": from_date, "to_date": to_date, "group_by": "Group by Voucher (Consolidated)", } columns_gl, data_gl = report_gl.get_data(limit=500, user="******", filters=report_gl_filters, as_dict=True) # Add serial numbers columns_gl.insert(0, frappe._dict(fieldname="idx", label="", width="30px")) for i in range(len(data_gl)): data_gl[i]["idx"] = i + 1 # Get ageing summary report content data_ageing = [] labels_ageing = [] if settings_doc.no_ageing != 1: report_ageing = frappe.get_doc("Report", "Accounts Receivable Summary") report_ageing_filters = { "company": company, "ageing_based_on": "Posting Date", "report_date": datetime.datetime.today(), "range1": 30, "range2": 60, "range3": 90, "range4": 120, "customer": customer_name, } columns_ageing, data_ageing = report_ageing.get_data( limit=50, user="******", filters=report_ageing_filters, as_dict=True) labels_ageing = {} for col in columns_ageing: if "range" in col["fieldname"]: labels_ageing[col["fieldname"]] = col["label"] # Get Letter Head no_letterhead = bool( frappe.db.get_single_value("Customer Statements Sender", "no_letter_head")) letter_head = frappe._dict( printview.get_letter_head(settings_doc, no_letterhead) or {}) if letter_head.content: letter_head.content = frappe.utils.jinja.render_template( letter_head.content, {"doc": settings_doc.as_dict()}) # Render Template date_time = global_date_format(now()) + " " + format_time(now()) currency = frappe.db.get_value("Company", company, "default_currency") report_html_data = frappe.render_template( "erpnext_customer_statements_sender/templates/report/customer_statement_jinja.html", { "title": "Customer Statement for {0}".format(customer_name), "description": "Customer Statement for {0}".format(customer_name), "date_time": date_time, "columns": columns_gl, "data": data_gl, "report_name": "Customer Statement for {0}".format(customer_name), "filters": report_gl_filters, "currency": currency, "letter_head": letter_head.content, "billing_address": get_billing_address(customer_name), "labels_ageing": labels_ageing, "data_ageing": data_ageing, }, ) return report_html_data
def get_blog_context(context): context["blog_fields"] = [ "published_on", "blog_intro", "route", "title", "content", "name", "blog_category" ] context["blog_conditions"] = "" hooks = frappe.get_hooks("starter_theme_blog_context_before") for hook in hooks: frappe.call(hook, context) #posts = frappe.get_all("Blog Post", fields=context["blog_fields"], filters={"published": 1}, order_by="published_on desc, creation desc", limit=cint(context.get("theme_display_blog_length", 4))) query = """\ select %(fields)s, ifnull(t1.blog_intro, t1.content) as intro, t2.full_name, t2.avatar, t1.blogger, (select count(name) from `tabCommunication` where communication_type='Comment' and comment_type='Comment' and reference_doctype='Blog Post' and reference_name=t1.name) as comments from `tabBlog Post` t1, `tabBlogger` t2 where ifnull(t1.published,0)=1 and t1.blogger = t2.name %(condition)s order by published_on desc, t1.creation desc limit %(start)s, %(page_len)s""" % { "start": 0, "page_len": cint(context.get("theme_display_blog_length", 4)), "condition": (" and " + " and ".join(context["blog_conditions"])) if context.get("blog_conditions") else "", "fields": ",".join(["t1.%s" % field for field in context["blog_fields"]]) } posts = frappe.db.sql(query, as_dict=1) for post in posts: post.cover_image = find_first_image(post.content) post.published = global_date_format(post.creation) post.content = strip_html_tags(post.content[:340]) post.intro = post.blog_intro if post.blog_intro else post.content if not post.comments: post.comment_text = _('No comments yet') elif post.comments == 1: post.comment_text = _('1 comment') else: post.comment_text = _('{0} comments').format(str(post.comments)) post.avatar = post.avatar or "" post.category = frappe.db.get_value('Blog Category', post.blog_category, ['route', 'title'], as_dict=True) if (not "http:" in post.avatar or "https:" in post.avatar) and not post.avatar.startswith("/"): post.avatar = "/" + post.avatar context["blog_posts"] = posts hooks = frappe.get_hooks("starter_theme_blog_context_after") for hook in hooks: frappe.call(hook, context)
def get_report_content(company, customer_name, from_date=None, to_date=None): '''Returns html for the report in PDF format''' settings_doc = frappe.get_single('Customer Statements Sender') if not from_date: from_date = get_first_day(today()).strftime("%Y-%m-%d") if not to_date: to_date = today() # Get General Ledger report content report_gl = frappe.get_doc('Report', 'General Ledger') report_gl_filters = { 'company': company, 'party_type': 'Customer', 'party': [customer_name], 'from_date': from_date, 'to_date': to_date, 'group_by': 'Group by Voucher (Consolidated)' } columns_gl, data_gl = report_gl.get_data(limit=500, user="******", filters=report_gl_filters, as_dict=True) # Add serial numbers columns_gl.insert(0, frappe._dict(fieldname='idx', label='', width='30px')) for i in range(len(data_gl)): data_gl[i]['idx'] = i + 1 # Get ageing summary report content data_ageing = [] labels_ageing = [] if settings_doc.no_ageing != 1: report_ageing = frappe.get_doc('Report', 'Accounts Receivable Summary') report_ageing_filters = { 'company': company, 'ageing_based_on': 'Posting Date', 'report_date': datetime.datetime.today(), 'range1': 30, 'range2': 60, 'range3': 90, 'range4': 120, 'customer': customer_name } columns_ageing, data_ageing = report_ageing.get_data( limit=50, user="******", filters=report_ageing_filters, as_dict=True) labels_ageing = {} for col in columns_ageing: if 'range' in col['fieldname']: labels_ageing[col['fieldname']] = col['label'] # Get Letter Head no_letterhead = bool( frappe.db.get_single_value('Customer Statements Sender', 'no_letter_head')) letter_head = frappe._dict( printview.get_letter_head(settings_doc, no_letterhead) or {}) if letter_head.content: letter_head.content = frappe.utils.jinja.render_template( letter_head.content, {"doc": settings_doc.as_dict()}) # Render Template date_time = global_date_format(now()) + ' ' + format_time(now()) currency = frappe.db.get_value('Company', company, 'default_currency') report_html_data = frappe.render_template( 'erpnext_customer_statements_sender/templates/report/customer_statement_jinja.html', { 'title': 'Customer Statement for {0}'.format(customer_name), 'description': 'Customer Statement for {0}'.format(customer_name), 'date_time': date_time, 'columns': columns_gl, 'data': data_gl, 'report_name': 'Customer Statement for {0}'.format(customer_name), 'filters': report_gl_filters, 'currency': currency, 'letter_head': letter_head.content, 'billing_address': get_billing_address(customer_name), 'labels_ageing': labels_ageing, 'data_ageing': data_ageing }) return report_html_data
def get_message_details(self): '''Return args for template''' dws_group = frappe.get_doc('Daily Work Summary Group', self.daily_work_summary_group) replies = frappe.get_all('Communication', fields=['content', 'text_content', 'sender'], filters=dict(reference_doctype=self.doctype, reference_name=self.name, communication_type='Communication', sent_or_received='Received'), order_by='creation asc') did_not_reply = self.email_sent_to.split() for d in replies: user = frappe.db.get_values("User", {"email": d.sender}, ["full_name", "user_image"], as_dict=True) d.sender_name = user[0].full_name if user else d.sender d.image = user[0].image if user and user[0].image else None original_image = d.image # make thumbnail image try: if original_image: file_name = frappe.get_list('File', {'file_url': original_image}) if file_name: file_name = file_name[0].name file_doc = frappe.get_doc('File', file_name) thumbnail_image = file_doc.make_thumbnail( set_as_thumbnail=False, width=100, height=100, crop=True ) d.image = thumbnail_image except: d.image = original_image if d.sender in did_not_reply: did_not_reply.remove(d.sender) if d.text_content: d.content = frappe.utils.md_to_html( EmailReplyParser.parse_reply(d.text_content) ) did_not_reply = [(frappe.db.get_value("User", {"email": email}, "full_name") or email) for email in did_not_reply] return dict(replies=replies, original_message=dws_group.message, title=_('Work Summary for {0}'.format( global_date_format(self.creation) )), did_not_reply=', '.join(did_not_reply) or '', did_not_reply_title=_('No replies from'))
def get_blog_list( doctype, txt=None, filters=None, limit_start=0, limit_page_length=20, order_by=None ): conditions = [] category = filters.blog_category or frappe.utils.escape_html( frappe.local.form_dict.blog_category or frappe.local.form_dict.category ) if filters: if filters.blogger: conditions.append("t1.blogger=%s" % frappe.db.escape(filters.blogger)) if category: conditions.append("t1.blog_category=%s" % frappe.db.escape(category)) if txt: conditions.append( '(t1.content like {0} or t1.title like {0}")'.format(frappe.db.escape("%" + txt + "%")) ) if conditions: frappe.local.no_cache = 1 query = """\ select t1.title, t1.name, t1.blog_category, t1.route, t1.published_on, t1.read_time, t1.published_on as creation, t1.read_time as read_time, t1.featured as featured, t1.meta_image as cover_image, t1.content as content, t1.content_type as content_type, t1.content_html as content_html, t1.content_md as content_md, ifnull(t1.blog_intro, t1.content) as intro, t2.full_name, t2.avatar, t1.blogger, (select count(name) from `tabComment` where comment_type='Comment' and reference_doctype='Blog Post' and reference_name=t1.name) as comments from `tabBlog Post` t1, `tabBlogger` t2 where ifnull(t1.published,0)=1 and t1.blogger = t2.name %(condition)s order by featured desc, published_on desc, name asc limit %(page_len)s OFFSET %(start)s""" % { "start": limit_start, "page_len": limit_page_length, "condition": (" and " + " and ".join(conditions)) if conditions else "", } posts = frappe.db.sql(query, as_dict=1) for post in posts: post.content = get_html_content_based_on_type(post, "content", post.content_type) if not post.cover_image: post.cover_image = find_first_image(post.content) post.published = global_date_format(post.creation) post.content = strip_html_tags(post.content) if not post.comments: post.comment_text = _("No comments yet") elif post.comments == 1: post.comment_text = _("1 comment") else: post.comment_text = _("{0} comments").format(str(post.comments)) post.avatar = post.avatar or "" post.category = frappe.db.get_value( "Blog Category", post.blog_category, ["name", "route", "title"], as_dict=True ) if ( post.avatar and (not "http:" in post.avatar and not "https:" in post.avatar) and not post.avatar.startswith("/") ): post.avatar = "/" + post.avatar return posts