Merge branch 'master' of github.com:webnotes/erpnext
diff --git a/erpnext/selling/doctype/lead/lead.txt b/erpnext/selling/doctype/lead/lead.txt
index a467f3a..056fc16 100644
--- a/erpnext/selling/doctype/lead/lead.txt
+++ b/erpnext/selling/doctype/lead/lead.txt
@@ -5,7 +5,7 @@
{
'creation': '2012-06-05 20:03:20',
'docstatus': 0,
- 'modified': '2012-08-02 18:01:53',
+ 'modified': '2012-08-03 10:49:22',
'modified_by': u'Administrator',
'owner': u'Administrator'
},
@@ -686,5 +686,14 @@
'fieldtype': u'Check',
'label': u'Unsubscribed',
'permlevel': 0
+ },
+
+ # DocField
+ {
+ 'doctype': u'DocField',
+ 'fieldname': u'blog_subscriber',
+ 'fieldtype': u'Check',
+ 'label': u'Blog Subscriber',
+ 'permlevel': 0
}
]
\ No newline at end of file
diff --git a/erpnext/startup/__init__.py b/erpnext/startup/__init__.py
index 3549898..cd443a0 100644
--- a/erpnext/startup/__init__.py
+++ b/erpnext/startup/__init__.py
@@ -15,9 +15,13 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# add startup propertes
-
-add_in_head = """
-<style>
-
-</style>
-"""
\ No newline at end of file
+mail_footer = """<div style="padding: 7px; text-align: right; color: #888"><small>Sent via
+ <a style="color: #888" href="https://erpnext.com">ERPNext</a></div>"""
+
+def get_monthly_bulk_mail_limit():
+ import webnotes
+ # if global settings, then 500 or unlimited
+ if webnotes.conn.get_value('Email Settings', None, 'outgoing_mail_server'):
+ return 999999
+ else:
+ return 500
\ No newline at end of file
diff --git a/erpnext/startup/schedule_handlers.py b/erpnext/startup/schedule_handlers.py
index 021cb1f..2df7a57 100644
--- a/erpnext/startup/schedule_handlers.py
+++ b/erpnext/startup/schedule_handlers.py
@@ -42,7 +42,7 @@
run_fn(send)
# send bulk emails
- from webnotes.utils.email_lib.bulk import cleanup
+ from webnotes.utils.email_lib.bulk import clear_outbox
run_fn(clear_outbox)
def execute_weekly():
diff --git a/erpnext/website/blog.py b/erpnext/website/blog.py
index 5692f51..ea1992b 100644
--- a/erpnext/website/blog.py
+++ b/erpnext/website/blog.py
@@ -106,6 +106,25 @@
return comment_html
+@webnotes.whitelist(allow_guest=True)
+def add_subscriber():
+ """add blog subscriber to lead"""
+ full_name = webnotes.form_dict.get('your_name')
+ email = webnotes.form_dict.get('your_email_address')
+ name = webnotes.conn.sql("""select name from tabLead where email_id=%s""", email)
+
+ from webnotes.model.doc import Document
+ if name:
+ lead = Document('Lead', name[0][0])
+ else:
+ lead = Document('Lead')
+
+ lead.unsubscribed = 0
+ lead.blog_subscriber = 1
+ lead.lead_name = full_name
+ lead.email_id = email
+ lead.save()
+
def get_blog_content(blog_page_name):
import website.web_cache
content = website.web_cache.get_html(blog_page_name)
diff --git a/erpnext/website/doctype/blog/blog.js b/erpnext/website/doctype/blog/blog.js
new file mode 100644
index 0000000..b0c1ec2
--- /dev/null
+++ b/erpnext/website/doctype/blog/blog.js
@@ -0,0 +1,25 @@
+// ERPNext - web based ERP (http://erpnext.com)
+// Copyright (C) 2012 Web Notes Technologies Pvt Ltd
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+cur_frm.cscript.refresh = function(doc) {
+ if(!doc.__islocal && doc.published && !doc.email_sent) {
+ cur_frm.add_custom_button('Email Subscribers', function() {
+ $c_obj(make_doclist(doc.doctype, doc.name), 'send_emails', '', function(r) {
+ cur_frm.refresh();
+ });
+ })
+ }
+}
\ No newline at end of file
diff --git a/erpnext/website/doctype/blog/blog.py b/erpnext/website/doctype/blog/blog.py
index e361ece..786941c 100644
--- a/erpnext/website/doctype/blog/blog.py
+++ b/erpnext/website/doctype/blog/blog.py
@@ -29,6 +29,31 @@
super(DocType, self).__init__('Blog')
self.doc, self.doclist = d, dl
+ def send_emails(self):
+ """send emails to subscribers"""
+ if self.doc.email_sent:
+ webnotes.msgprint("""Blog Subscribers already updated""", raise_exception=1)
+
+ from webnotes.utils.email_lib.bulk import send
+ from markdown2 import markdown
+ import webnotes.utils
+
+ # get leads that are subscribed to the blog
+ recipients = [e[0] for e in webnotes.conn.sql("""select distinct email_id from tabLead where
+ ifnull(blog_subscriber,0)=1""")]
+
+ # make heading as link
+ content = '<h2><a href="%s/%s.html">%s</a></h2>\n\n%s' % (webnotes.utils.get_request_site_address(),
+ self.doc.page_name, self.doc.title, markdown(self.doc.content))
+
+ # send the blog
+ send(recipients = recipients, doctype='Lead', email_field='email_id',
+ first_name_field = 'lead_name', last_name_field="", subject=self.doc.title,
+ message = markdown(content))
+
+ webnotes.conn.set(self.doc, 'email_sent', 1)
+ webnotes.msgprint("""Scheduled to send to %s subscribers""" % len(recipients))
+
def on_update(self):
super(DocType, self).on_update()
if not webnotes.utils.cint(self.doc.published):
diff --git a/erpnext/website/doctype/blog/blog.txt b/erpnext/website/doctype/blog/blog.txt
index 6ed7143..35d31c6 100644
--- a/erpnext/website/doctype/blog/blog.txt
+++ b/erpnext/website/doctype/blog/blog.txt
@@ -3,9 +3,9 @@
# These values are common in all dictionaries
{
- 'creation': '2012-07-13 13:02:27',
+ 'creation': '2012-07-27 19:32:53',
'docstatus': 0,
- 'modified': '2012-07-27 14:15:24',
+ 'modified': '2012-08-03 12:18:36',
'modified_by': u'Administrator',
'owner': u'Administrator'
},
@@ -116,6 +116,16 @@
# DocField
{
'doctype': u'DocField',
+ 'fieldname': u'email_sent',
+ 'fieldtype': u'Check',
+ 'hidden': 1,
+ 'label': u'Email Sent',
+ 'permlevel': 0
+ },
+
+ # DocField
+ {
+ 'doctype': u'DocField',
'fieldname': u'file_list',
'fieldtype': u'Text',
'hidden': 1,
diff --git a/erpnext/website/templates/html/blog_page.html b/erpnext/website/templates/html/blog_page.html
index 3b8348d..12a1c7a 100644
--- a/erpnext/website/templates/html/blog_page.html
+++ b/erpnext/website/templates/html/blog_page.html
@@ -2,6 +2,7 @@
{% block javascript %}
{% include "js/blog_page.js" %}
+ {% include "js/blog_subscribe.js" %}
{% endblock %}
{% block css %}
@@ -41,11 +42,9 @@
<div class="layout-side-section">
<p><a href="blog.html">All Blogs</a></p>
<br />
- <h4>Subscribe</h4>
- <p>
- <img src="images/feed.png" style="margin-right: 4px; margin-bottom: -4px">
- <a href="rss.xml" target="_blank">RSS Feed</a>
- </p>
+ {% block blog_subscribe %}
+ {% include "html/blog_subscribe.html" %}
+ {% endblock %}
<br />
<h4>Recent Posts</h4>
<div class="recent-posts" style="min-height: 100px;"></div>
diff --git a/erpnext/website/templates/html/blog_subscribe.html b/erpnext/website/templates/html/blog_subscribe.html
new file mode 100644
index 0000000..7a4fd49
--- /dev/null
+++ b/erpnext/website/templates/html/blog_subscribe.html
@@ -0,0 +1,9 @@
+<h4>Subscribe</h4>
+<br>
+<p>
+<button class="btn btn-warning btn-blog-subscribe">Get Updates via Email</button>
+</p>
+<p>
+<img src="images/feed.png" style="margin-right: 4px; margin-bottom: -4px">
+<a href="rss.xml" target="_blank">RSS Feed</a>
+</p>
\ No newline at end of file
diff --git a/erpnext/website/templates/js/blog_page.js b/erpnext/website/templates/js/blog_page.js
index 56dcf21..02d6dd5 100644
--- a/erpnext/website/templates/js/blog_page.js
+++ b/erpnext/website/templates/js/blog_page.js
@@ -59,8 +59,9 @@
hide_refresh: true,
render_row: function(parent, data) {
if(data.content && data.content.length>=100) data.content += '...';
- parent.innerHTML = repl('<a href="%(page_name)s.html">%(title)s</a>\
- <div class="comment">%(content)s</div><br>', data);
+ parent.innerHTML = repl('<div style="font-size: 80%">\
+ <a href="%(page_name)s.html">%(title)s</a>\
+ <div class="comment">%(content)s</div><br></div>', data);
// adjust page height depending on sidebar height
erpnext.blog.adjust_page_height(wrapper);
diff --git a/erpnext/website/templates/js/blog_subscribe.js b/erpnext/website/templates/js/blog_subscribe.js
new file mode 100644
index 0000000..b3e10a7
--- /dev/null
+++ b/erpnext/website/templates/js/blog_subscribe.js
@@ -0,0 +1,33 @@
+wn.provide('erpnext.blog');
+
+(function() {
+ $('body').on('click', '.btn-blog-subscribe', function() {
+ var d = new wn.ui.Dialog({
+ title: "Get Blog Updates via Email",
+ fields: [
+ {label: "Your Name", fieldtype:"Data", reqd:1},
+ {label: "Your Email Address", fieldtype:"Data", reqd:1
+ ,description: "You can unsubscribe anytime."},
+ {label: "Subscribe", fieldtype:"Button"}
+ ]
+ });
+ $(d.fields_dict.subscribe.input).click(function() {
+ var args = d.get_values();
+ if(!args) return;
+ wn.call({
+ method: 'website.blog.add_subscriber',
+ args: args,
+ callback: function(r) {
+ if(r.exc) {
+ msgprint('Opps there seems to be some error, Please check back after some time.');
+ } else {
+ msgprint('Thanks for subscribing!');
+ }
+ d.hide();
+ },
+ btn: this
+ })
+ })
+ d.show()
+ })
+})()
diff --git a/erpnext/website/templates/pages/blog.html b/erpnext/website/templates/pages/blog.html
index 40c90c2..17fd6e7 100644
--- a/erpnext/website/templates/pages/blog.html
+++ b/erpnext/website/templates/pages/blog.html
@@ -2,6 +2,7 @@
{% block javascript %}
{% include "js/blog.js" %}
+ {% include "js/blog_subscribe.js" %}
{% endblock %}
{% block css %}
@@ -23,17 +24,9 @@
</div>
<div class="layout-side-section">
- <!-- for later
- <h4>Get Updates</h4>
- <p>
- <input name="blog-subscribe">
- <button class="btn" id="blog-subscribe">Subscribe</button>
- </p>-->
- <h4>Subscribe</h4>
- <p>
- <img src="images/feed.png" style="margin-right: 4px; margin-bottom: -4px">
- <a href="rss.xml" target="_blank">RSS Feed</a>
- </p>
+ {% block blog_subscribe %}
+ {% include "html/blog_subscribe.html" %}
+ {% endblock %}
</div>
<div style="clear: both"></div>
</div>
diff --git a/public/js/all-app.js b/public/js/all-app.js
index f7fc897..df69de6 100644
--- a/public/js/all-app.js
+++ b/public/js/all-app.js
@@ -870,7 +870,8 @@
* lib/js/wn/ui/dialog.js
*/
wn.widgets.FieldGroup=function(){this.first_button=false;this.make_fields=function(body,fl){if(!window.make_field){wn.require('css/fields.css');wn.require('js/fields.js');}
-$y(this.body,{padding:'11px'});this.fields_dict={};for(var i=0;i<fl.length;i++){var df=fl[i];var div=$a(body,'div','',{margin:'6px 0px'})
+$y(this.body,{padding:'11px'});this.fields_dict={};for(var i=0;i<fl.length;i++){var df=fl[i];if(!df.fieldname&&df.label){df.fieldname=df.label.replace(/ /g,'_').toLowerCase();}
+var div=$a(body,'div','',{margin:'6px 0px'})
f=make_field(df,null,div,null);f.not_in_form=1;this.fields_dict[df.fieldname]=f
f.refresh();if(df.fieldtype=='Button'&&!this.first_button){$(f.input).addClass('btn-info');this.first_button=true;}}}
this.get_values=function(){var ret={};var errors=[];for(var key in this.fields_dict){var f=this.fields_dict[key];var v=f.get_value?f.get_value():null;if(f.df.reqd&&!v)
diff --git a/public/js/all-web.js b/public/js/all-web.js
index a921819..5a4a4a1 100644
--- a/public/js/all-web.js
+++ b/public/js/all-web.js
@@ -529,7 +529,8 @@
* lib/js/wn/ui/dialog.js
*/
wn.widgets.FieldGroup=function(){this.first_button=false;this.make_fields=function(body,fl){if(!window.make_field){wn.require('css/fields.css');wn.require('js/fields.js');}
-$y(this.body,{padding:'11px'});this.fields_dict={};for(var i=0;i<fl.length;i++){var df=fl[i];var div=$a(body,'div','',{margin:'6px 0px'})
+$y(this.body,{padding:'11px'});this.fields_dict={};for(var i=0;i<fl.length;i++){var df=fl[i];if(!df.fieldname&&df.label){df.fieldname=df.label.replace(/ /g,'_').toLowerCase();}
+var div=$a(body,'div','',{margin:'6px 0px'})
f=make_field(df,null,div,null);f.not_in_form=1;this.fields_dict[df.fieldname]=f
f.refresh();if(df.fieldtype=='Button'&&!this.first_button){$(f.input).addClass('btn-info');this.first_button=true;}}}
this.get_values=function(){var ret={};var errors=[];for(var key in this.fields_dict){var f=this.fields_dict[key];var v=f.get_value?f.get_value():null;if(f.df.reqd&&!v)