chore: Key Validation and restructure
- Added API Key validation in Video Settings
- Moved Statistics section above description in Video
- Moved id retrieving from URL to py side
- Removed js side calls, added section toggling in js
- Restructured Code
diff --git a/erpnext/utilities/doctype/video/video.js b/erpnext/utilities/doctype/video/video.js
index c2994ec..9cb5a15 100644
--- a/erpnext/utilities/doctype/video/video.js
+++ b/erpnext/utilities/doctype/video/video.js
@@ -3,29 +3,15 @@
frappe.ui.form.on('Video', {
refresh: function (frm) {
- if (frm.doc.provider === "YouTube") {
- frappe.db.get_single_value("Video Settings", "enable_youtube_tracking").then(value => {
- if (value) {
- frm.events.get_video_stats(frm);
- } else {
- frm.set_df_property('youtube_tracking_section', 'hidden', true);
- }
- });
- }
-
+ frm.events.toggle_youtube_statistics_section(frm);
frm.add_custom_button("Watch Video", () => frappe.help.show_video(frm.doc.url, frm.doc.title));
},
- get_video_stats: (frm) => {
- const expression = '(?:youtube.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu.be/)([^"&?\\s]{11})';
- var youtube_id = frm.doc.url.match(expression)[1];
-
- frappe.call({
- method: "erpnext.utilities.doctype.video.video.get_video_stats",
- args: {
- docname: frm.doc.name,
- youtube_id: youtube_id
- }
- });
+ toggle_youtube_statistics_section: (frm) => {
+ if (frm.doc.provider === "YouTube") {
+ frappe.db.get_single_value("Video Settings", "enable_youtube_tracking").then( val => {
+ frm.toggle_display("youtube_tracking_section", val);
+ });
+ }
}
});
diff --git a/erpnext/utilities/doctype/video/video.json b/erpnext/utilities/doctype/video/video.json
index a6c0f3f..11df56c 100644
--- a/erpnext/utilities/doctype/video/video.json
+++ b/erpnext/utilities/doctype/video/video.json
@@ -14,15 +14,15 @@
"column_break_4",
"publish_date",
"duration",
- "section_break_7",
- "description",
- "image",
"youtube_tracking_section",
"like_count",
"view_count",
"col_break",
"dislike_count",
- "comment_count"
+ "comment_count",
+ "section_break_7",
+ "description",
+ "image"
],
"fields": [
{
@@ -122,7 +122,7 @@
],
"image_field": "image",
"links": [],
- "modified": "2020-08-02 04:26:16.345569",
+ "modified": "2020-09-04 12:59:28.283622",
"modified_by": "Administrator",
"module": "Utilities",
"name": "Video",
diff --git a/erpnext/utilities/doctype/video/video.py b/erpnext/utilities/doctype/video/video.py
index a2a4a7b..2299f95 100644
--- a/erpnext/utilities/doctype/video/video.py
+++ b/erpnext/utilities/doctype/video/video.py
@@ -5,49 +5,48 @@
from __future__ import unicode_literals
import frappe
import json
+import re
from frappe.model.document import Document
+from frappe import _
from six import string_types
from pyyoutube import Api
class Video(Document):
- pass
+ def validate(self):
+ self.set_youtube_statistics()
+
+ def set_youtube_statistics(self):
+ tracking_enabled = frappe.db.get_single_value("Video Settings", "enable_youtube_tracking")
+ if self.provider == "YouTube" and not tracking_enabled:
+ return
+
+ api_key = frappe.db.get_single_value("Video Settings", "api_key")
+ youtube_id = get_id_from_url(self.url)
+ api = Api(api_key=api_key)
+
+ try:
+ video = api.get_video_by_id(video_id=youtube_id)
+ video_stats = video.items[0].to_dict().get('statistics')
+
+ self.like_count = video_stats.get('likeCount')
+ self.view_count = video_stats.get('viewCount')
+ self.dislike_count = video_stats.get('dislikeCount')
+ self.comment_count = video_stats.get('commentCount')
+
+ except Exception:
+ title = "Failed to Update YouTube Statistics for Video: {0}".format(self.name)
+ frappe.log_error(title + "\n\n" + frappe.get_traceback(), title=title)
@frappe.whitelist()
-def get_video_stats(docname, youtube_id, update=True):
- '''Returns/Sets video statistics
-
- :param docname: Name of Video
- :param youtube_id: Unique ID from URL
- :param update: Updates db stats value if True, else returns statistics
+def get_id_from_url(url):
'''
- if isinstance(update, string_types):
- update = json.loads(update)
+ Returns video id from url
- api_key = frappe.db.get_single_value("Video Settings", "api_key")
- api = Api(api_key=api_key)
+ :param youtube url: String URL
+ '''
+ if not isinstance(url, string_types):
+ frappe.throw(_("URL can only be a string"), title=_("Invalid URL"))
- try:
- video = api.get_video_by_id(video_id=youtube_id)
- video_stats = video.items[0].to_dict().get('statistics')
- stats = {
- 'like_count' : video_stats.get('likeCount'),
- 'view_count' : video_stats.get('viewCount'),
- 'dislike_count' : video_stats.get('dislikeCount'),
- 'comment_count' : video_stats.get('commentCount')
- }
-
- if not update:
- return stats
-
- frappe.db.sql("""
- UPDATE `tabVideo`
- SET
- like_count = %(like_count)s,
- view_count = %(view_count)s,
- dislike_count = %(dislike_count)s,
- comment_count = %(comment_count)s
- WHERE name = {0}""".format(frappe.db.escape(docname)), stats) #nosec
- frappe.db.commit()
- except:
- message = "Please make sure you are connected to the Internet"
- frappe.log_error(message + "\n\n" + frappe.get_traceback(), "Failed to Update YouTube Statistics for Video: {0}".format(docname))
\ No newline at end of file
+ pattern = re.compile(r'[a-z\:\//\.]+(youtube|youtu)\.(com|be)/(watch\?v=|embed/|.+\?v=)?([^"&?\s]{11})?')
+ id = pattern.match(url)
+ return id.groups()[-1]
\ No newline at end of file
diff --git a/erpnext/utilities/doctype/video_settings/video_settings.py b/erpnext/utilities/doctype/video_settings/video_settings.py
index 7008066..36fb54f 100644
--- a/erpnext/utilities/doctype/video_settings/video_settings.py
+++ b/erpnext/utilities/doctype/video_settings/video_settings.py
@@ -3,8 +3,20 @@
# For license information, please see license.txt
from __future__ import unicode_literals
-# import frappe
+import frappe
+from frappe import _
from frappe.model.document import Document
+from apiclient.discovery import build
class VideoSettings(Document):
- pass
+ def validate(self):
+ self.validate_youtube_api_key()
+
+ def validate_youtube_api_key(self):
+ if self.enable_youtube_tracking and self.api_key:
+ try:
+ build("youtube", "v3", developerKey=self.api_key)
+ except Exception:
+ title = _("Failed to Authenticate the API key.")
+ frappe.log_error(title + "\n\n" + frappe.get_traceback(), title=title)
+ frappe.throw(title + " Please check the error logs.", title=_("Invalid Credentials"))
\ No newline at end of file