Merge branch 'staging' into develop
This commit is contained in:
commit
19d28a1686
8 changed files with 177 additions and 141 deletions
|
|
@ -17,7 +17,7 @@ from faker import Faker
|
|||
from .exceptions import *
|
||||
from .utils.jinja import (get_jenv, get_template, render_template, get_email_from_template, get_jloader)
|
||||
|
||||
__version__ = '10.1.61'
|
||||
__version__ = '10.1.63'
|
||||
__title__ = "Frappe Framework"
|
||||
|
||||
local = Local()
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
{
|
||||
"allow_copy": 0,
|
||||
"allow_events_in_timeline": 0,
|
||||
"allow_guest_to_view": 0,
|
||||
"allow_import": 0,
|
||||
"allow_rename": 1,
|
||||
|
|
@ -15,6 +16,7 @@
|
|||
"fields": [
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
|
|
@ -42,11 +44,12 @@
|
|||
"reqd": 1,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
|
|
@ -75,11 +78,12 @@
|
|||
"reqd": 1,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
|
|
@ -107,11 +111,12 @@
|
|||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
|
|
@ -137,16 +142,17 @@
|
|||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_from": "report.report_type",
|
||||
"fetch_from": "report.report_type",
|
||||
"fieldname": "report_type",
|
||||
"fieldtype": "Read Only",
|
||||
"hidden": 0,
|
||||
|
|
@ -170,11 +176,12 @@
|
|||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
|
|
@ -201,11 +208,12 @@
|
|||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
|
|
@ -233,11 +241,12 @@
|
|||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
|
|
@ -267,11 +276,12 @@
|
|||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
|
|
@ -300,14 +310,15 @@
|
|||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"collapsible": 1,
|
||||
"columns": 0,
|
||||
"depends_on": "eval:doc.report_type !== 'Report Builder'",
|
||||
"fieldname": "report_filters",
|
||||
|
|
@ -332,11 +343,12 @@
|
|||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
|
|
@ -363,11 +375,12 @@
|
|||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
|
|
@ -394,11 +407,12 @@
|
|||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
|
|
@ -425,11 +439,12 @@
|
|||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
|
|
@ -456,11 +471,12 @@
|
|||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
|
|
@ -487,11 +503,12 @@
|
|||
"reqd": 1,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
|
|
@ -521,11 +538,12 @@
|
|||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
|
|
@ -551,11 +569,12 @@
|
|||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
|
|
@ -572,7 +591,7 @@
|
|||
"label": "Frequency",
|
||||
"length": 0,
|
||||
"no_copy": 0,
|
||||
"options": "Daily\nWeekly\nMonthly",
|
||||
"options": "Daily\nWeekdays\nWeekly\nMonthly",
|
||||
"permlevel": 0,
|
||||
"precision": "",
|
||||
"print_hide": 0,
|
||||
|
|
@ -583,11 +602,12 @@
|
|||
"reqd": 1,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
|
|
@ -615,11 +635,12 @@
|
|||
"reqd": 1,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 1,
|
||||
|
|
@ -646,11 +667,12 @@
|
|||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
|
|
@ -677,7 +699,7 @@
|
|||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0
|
||||
}
|
||||
],
|
||||
|
|
@ -691,7 +713,7 @@
|
|||
"issingle": 0,
|
||||
"istable": 0,
|
||||
"max_attachments": 0,
|
||||
"modified": "2018-05-16 22:42:57.093530",
|
||||
"modified": "2018-11-13 01:59:17.816718",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Email",
|
||||
"name": "Auto Email Report",
|
||||
|
|
@ -744,5 +766,6 @@
|
|||
"sort_field": "modified",
|
||||
"sort_order": "DESC",
|
||||
"track_changes": 1,
|
||||
"track_seen": 0
|
||||
"track_seen": 0,
|
||||
"track_views": 0
|
||||
}
|
||||
|
|
@ -3,17 +3,22 @@
|
|||
# For license information, please see license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import frappe, json
|
||||
|
||||
import calendar
|
||||
import json
|
||||
from datetime import timedelta
|
||||
|
||||
import frappe
|
||||
from frappe import _
|
||||
from frappe.model.document import Document
|
||||
from datetime import timedelta
|
||||
import frappe.utils
|
||||
from frappe.utils import now, global_date_format, format_time
|
||||
from frappe.utils.xlsxutils import make_xlsx
|
||||
from frappe.utils import (format_time, get_link_to_form, get_url_to_report,
|
||||
global_date_format, now, now_datetime, validate_email_add)
|
||||
from frappe.utils.csvutils import to_csv
|
||||
from frappe.utils.xlsxutils import make_xlsx
|
||||
|
||||
max_reports_per_user = frappe.local.conf.max_reports_per_user or 3
|
||||
|
||||
|
||||
class AutoEmailReport(Document):
|
||||
def autoname(self):
|
||||
self.name = _(self.report)
|
||||
|
|
@ -31,7 +36,7 @@ class AutoEmailReport(Document):
|
|||
valid = []
|
||||
for email in self.email_to.split():
|
||||
if email:
|
||||
frappe.utils.validate_email_add(email, True)
|
||||
validate_email_add(email, True)
|
||||
valid.append(email)
|
||||
|
||||
self.email_to = '\n'.join(valid)
|
||||
|
|
@ -55,7 +60,7 @@ class AutoEmailReport(Document):
|
|||
|
||||
if self.report_type=='Report Builder' and self.data_modified_till:
|
||||
self.filters = json.loads(self.filters) if self.filters else {}
|
||||
self.filters['modified'] = ('>', frappe.utils.now_datetime() - timedelta(hours=self.data_modified_till))
|
||||
self.filters['modified'] = ('>', now_datetime() - timedelta(hours=self.data_modified_till))
|
||||
|
||||
columns, data = report.get_data(limit=self.no_of_rows or 100, user = self.user,
|
||||
filters = self.filters, as_dict=True)
|
||||
|
|
@ -94,11 +99,9 @@ class AutoEmailReport(Document):
|
|||
'date_time': date_time,
|
||||
'columns': columns,
|
||||
'data': data,
|
||||
'report_url': frappe.utils.get_url_to_report(self.report,
|
||||
self.report_type, report_doctype),
|
||||
'report_url': 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)
|
||||
'edit_report_settings': get_link_to_form('Auto Email Report', self.name)
|
||||
})
|
||||
|
||||
@staticmethod
|
||||
|
|
@ -169,15 +172,20 @@ def send_now(name):
|
|||
|
||||
def send_daily():
|
||||
'''Check reports to be sent daily'''
|
||||
now = frappe.utils.now_datetime()
|
||||
for report in frappe.get_all('Auto Email Report',
|
||||
{'enabled': 1, 'frequency': ('in', ('Daily', 'Weekly'))}):
|
||||
|
||||
current_day = calendar.day_name[now_datetime().weekday()]
|
||||
enabled_reports = frappe.get_all('Auto Email Report',
|
||||
filters={'enabled': 1, 'frequency': ('in', ('Daily', 'Weekdays', 'Weekly'))})
|
||||
|
||||
for report in enabled_reports:
|
||||
auto_email_report = frappe.get_doc('Auto Email Report', report.name)
|
||||
|
||||
# if not correct weekday, skip
|
||||
if auto_email_report.frequency=='Weekly':
|
||||
if now.weekday()!={'Monday':0,'Tuesday':1,'Wednesday':2,
|
||||
'Thursday':3,'Friday':4,'Saturday':5,'Sunday':6}[auto_email_report.day_of_week]:
|
||||
if auto_email_report.frequency == "Weekdays":
|
||||
if current_day in ("Saturday", "Sunday"):
|
||||
continue
|
||||
elif auto_email_report.frequency == 'Weekly':
|
||||
if auto_email_report.day_of_week != current_day:
|
||||
continue
|
||||
|
||||
auto_email_report.send()
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ source_link = "https://github.com/frappe/frappe"
|
|||
app_license = "MIT"
|
||||
|
||||
develop_version = '12.x.x-develop'
|
||||
staging_version = '11.0.3-beta.27'
|
||||
staging_version = '11.0.3-beta.28'
|
||||
|
||||
app_email = "info@frappe.io"
|
||||
|
||||
|
|
|
|||
|
|
@ -6,7 +6,11 @@ frappe.views.BaseList = class BaseList {
|
|||
}
|
||||
|
||||
show() {
|
||||
this.init().then(() => this.refresh());
|
||||
frappe.run_serially([
|
||||
() => this.init(),
|
||||
() => this.before_refresh(),
|
||||
() => this.refresh()
|
||||
]);
|
||||
}
|
||||
|
||||
init() {
|
||||
|
|
@ -344,6 +348,11 @@ frappe.views.BaseList = class BaseList {
|
|||
};
|
||||
}
|
||||
|
||||
before_refresh() {
|
||||
// modify args here just before making the request
|
||||
// see list_view.js
|
||||
}
|
||||
|
||||
refresh() {
|
||||
this.freeze(true);
|
||||
// fetch data from server
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList {
|
|||
return;
|
||||
}
|
||||
|
||||
this.init().then(() => this.refresh());
|
||||
super.show();
|
||||
}
|
||||
|
||||
get view_name() {
|
||||
|
|
@ -48,25 +48,6 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList {
|
|||
setup_defaults() {
|
||||
super.setup_defaults();
|
||||
|
||||
if (frappe.route_options) {
|
||||
// Priority 1: route filters
|
||||
this.filters = this.parse_filters_from_route_options();
|
||||
} else if (this.view_user_settings.filters) {
|
||||
// Priority 2: saved filters
|
||||
const saved_filters = this.view_user_settings.filters;
|
||||
this.filters = this.validate_filters(saved_filters);
|
||||
} else {
|
||||
// Priority 3: filters in listview_settings
|
||||
const filters = (this.settings.filters || []).map(f => {
|
||||
if (f.length === 3) {
|
||||
f = [this.doctype, f[0], f[1], f[2]];
|
||||
}
|
||||
return f;
|
||||
});
|
||||
|
||||
this.filters = filters;
|
||||
}
|
||||
|
||||
// initialize with saved order by
|
||||
this.sort_by = this.view_user_settings.sort_by || 'modified';
|
||||
this.sort_order = this.view_user_settings.sort_order || 'desc';
|
||||
|
|
@ -283,6 +264,32 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList {
|
|||
});
|
||||
}
|
||||
|
||||
before_refresh() {
|
||||
if (frappe.route_options) {
|
||||
// Priority 1: route filters
|
||||
this.filters = this.parse_filters_from_route_options();
|
||||
} else if (this.view_user_settings.filters) {
|
||||
// Priority 2: saved filters
|
||||
const saved_filters = this.view_user_settings.filters;
|
||||
this.filters = this.validate_filters(saved_filters);
|
||||
} else {
|
||||
// Priority 3: filters in listview_settings
|
||||
this.filters = (this.settings.filters || []).map(f => {
|
||||
if (f.length === 3) {
|
||||
f = [this.doctype, f[0], f[1], f[2]];
|
||||
}
|
||||
return f;
|
||||
});
|
||||
}
|
||||
|
||||
if (this.filters.length) {
|
||||
return this.filter_area.clear(false)
|
||||
.then(() => this.filter_area.set(this.filters));
|
||||
}
|
||||
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
toggle_result_area() {
|
||||
super.toggle_result_area();
|
||||
this.toggle_actions_menu_button(
|
||||
|
|
|
|||
|
|
@ -496,29 +496,25 @@ _f.Frm.prototype.render_form = function(is_a_different_doc) {
|
|||
// clear layout message
|
||||
this.layout.show_message();
|
||||
|
||||
// header must be refreshed before client methods
|
||||
// because add_custom_button
|
||||
this.refresh_header(is_a_different_doc);
|
||||
|
||||
// call trigger
|
||||
this.script_manager.trigger("refresh");
|
||||
|
||||
// trigger global trigger
|
||||
// to use this
|
||||
$(document).trigger('form-refresh', [this]);
|
||||
|
||||
// fields
|
||||
this.refresh_fields();
|
||||
|
||||
|
||||
// call onload post render for callbacks to be fired
|
||||
if(this.cscript.is_onload) {
|
||||
this.script_manager.trigger("onload_post_render");
|
||||
}
|
||||
|
||||
// update dashboard after refresh
|
||||
frappe.timeout(0.1).then(() => this.dashboard.after_refresh());
|
||||
|
||||
frappe.run_serially([
|
||||
// header must be refreshed before client methods
|
||||
// because add_custom_button
|
||||
() => this.refresh_header(is_a_different_doc),
|
||||
// call trigger
|
||||
() => this.script_manager.trigger("refresh"),
|
||||
// trigger global trigger
|
||||
// to use this
|
||||
() => $(document).trigger('form-refresh', [this]),
|
||||
// fields
|
||||
() => this.refresh_fields(),
|
||||
// call onload post render for callbacks to be fired
|
||||
() => {
|
||||
if(this.cscript.is_onload) {
|
||||
return this.script_manager.trigger("onload_post_render");
|
||||
}
|
||||
},
|
||||
() => this.dashboard.after_refresh()
|
||||
]);
|
||||
// focus on first input
|
||||
|
||||
if(this.is_new()) {
|
||||
|
|
|
|||
|
|
@ -1,60 +1,53 @@
|
|||
boto3
|
||||
chardet
|
||||
dropbox==9.1.0
|
||||
gunicorn
|
||||
jinja2
|
||||
markdown2==2.3.5
|
||||
PyMySQL
|
||||
maxminddb-geolite2
|
||||
python-dateutil
|
||||
pytz
|
||||
six
|
||||
werkzeug
|
||||
semantic_version
|
||||
boto3==1.9.45
|
||||
chardet==3.0.4
|
||||
cssmin==0.2.0
|
||||
dropbox==7.3.1
|
||||
gunicorn==19.9.0
|
||||
httplib2==0.12.0
|
||||
jinja2==2.10
|
||||
markdown2==2.3.6
|
||||
markupsafe==1.1.0
|
||||
PyMySQL==0.9.2
|
||||
python-geoip==1.2
|
||||
python-geoip-geolite2==2015.303
|
||||
python-dateutil==2.7.5
|
||||
pytz==2018.7
|
||||
six==1.11.0
|
||||
termcolor==1.1.0
|
||||
werkzeug==0.14.1
|
||||
semantic_version==2.6.0
|
||||
rauth>=0.6.2
|
||||
requests
|
||||
redis
|
||||
selenium
|
||||
babel
|
||||
ipython
|
||||
requests==2.20.1
|
||||
redis==2.10.6
|
||||
selenium==3.141.0
|
||||
babel==2.6.0
|
||||
ipython==5.8.0
|
||||
html2text==2016.9.19
|
||||
email_reply_parser
|
||||
click
|
||||
email_reply_parser==0.5.9
|
||||
click==7.0
|
||||
num2words==0.5.5
|
||||
watchdog==0.8.0
|
||||
bleach==2.1.4
|
||||
bleach-whitelist
|
||||
Pillow
|
||||
beautifulsoup4
|
||||
bleach-whitelist==0.0.9
|
||||
Pillow==5.3.0
|
||||
beautifulsoup4==4.6.3
|
||||
rq==0.12.0
|
||||
schedule
|
||||
cryptography
|
||||
pyopenssl
|
||||
ndg-httpsclient
|
||||
pyasn1
|
||||
zxcvbn-python
|
||||
unittest-xml-reporting
|
||||
oauthlib
|
||||
pdfkit
|
||||
PyJWT
|
||||
PyPDF2
|
||||
openpyxl
|
||||
pyotp
|
||||
pyqrcode
|
||||
pypng
|
||||
premailer
|
||||
croniter
|
||||
googlemaps
|
||||
braintree
|
||||
future
|
||||
passlib
|
||||
google-api-python-client
|
||||
google-auth
|
||||
google-auth-httplib2
|
||||
google-auth-oauthlib
|
||||
faker
|
||||
stripe
|
||||
psycopg2-binary
|
||||
coverage
|
||||
schedule==0.5.0
|
||||
cryptography==2.4.1
|
||||
pyopenssl==18.0.0
|
||||
ndg-httpsclient==0.5.1
|
||||
pyasn1==0.4.4
|
||||
zxcvbn-python==4.4.24
|
||||
unittest-xml-reporting==2.2.0
|
||||
oauthlib==2.1.0
|
||||
PyJWT==1.6.4
|
||||
PyPDF2==1.26.0
|
||||
openpyxl==2.5.10
|
||||
pyotp==2.2.7
|
||||
pyqrcode==1.2.1
|
||||
pypng==0.0.18
|
||||
premailer==3.2.0
|
||||
croniter==0.3.26
|
||||
googlemaps==3.0.2
|
||||
urllib3==1.23
|
||||
GitPython==2.1.11
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue