get-data.html 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. {% load static %}
  2. <!DOCTYPE html>
  3. <html lang="en"> <!--begin::Head-->
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  6. <title>Dashboard</title><!--begin::Primary Meta Tags-->
  7. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  8. <meta name="title" content="AdminLTE | Dashboard v2">
  9. <meta name="author" content="ColorlibHQ">
  10. <meta name="description"
  11. content="AdminLTE is a Free Bootstrap 5 Admin Dashboard, 30 example pages using Vanilla JS.">
  12. <meta name="keywords"
  13. content="bootstrap 5, bootstrap, bootstrap 5 admin dashboard, bootstrap 5 dashboard, bootstrap 5 charts, bootstrap 5 calendar, bootstrap 5 datepicker, bootstrap 5 tables, bootstrap 5 datatable, vanilla js datatable, colorlibhq, colorlibhq dashboard, colorlibhq admin dashboard">
  14. <!--end::Primary Meta Tags--><!--begin::Fonts-->
  15. <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource/source-sans-3@5.0.12/index.css"
  16. integrity="sha256-tXJfXfp6Ewt1ilPzLDtQnJV4hclT9XuaZUKyUvmyr+Q=" crossorigin="anonymous">
  17. <!--end::Fonts--><!--begin::Third Party Plugin(OverlayScrollbars)-->
  18. <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/overlayscrollbars@2.3.0/styles/overlayscrollbars.min.css"
  19. integrity="sha256-dSokZseQNT08wYEWiz5iLI8QPlKxG+TswNRD8k35cpg=" crossorigin="anonymous">
  20. <!--end::Third Party Plugin(OverlayScrollbars)--><!--begin::Third Party Plugin(Bootstrap Icons)-->
  21. <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.0/font/bootstrap-icons.min.css"
  22. integrity="sha256-Qsx5lrStHZyR9REqhUF8iQt73X06c8LGIUPzpOhwRrI=" crossorigin="anonymous">
  23. <!--end::Third Party Plugin(Bootstrap Icons)--><!--begin::Required Plugin(AdminLTE)-->
  24. <link rel="stylesheet" href="{% static './css/adminlte.css' %}"><!--end::Required Plugin(AdminLTE)--><!-- apexcharts -->
  25. <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/apexcharts@3.37.1/dist/apexcharts.css"
  26. integrity="sha256-4MX+61mt9NVvvuPjUWdUdyfZfxSB1/Rf9WtqRHgG5S0=" crossorigin="anonymous">
  27. <!-- <link rel="stylesheet" href="{% static 'dist/WOW-master/css/libs/animate.css' %}"> -->
  28. <link rel="stylesheet" href="{% static 'css/custom.css' %}">
  29. </head>
  30. <body class="layout-fixed sidebar-expand-lg sidebar-mini app-loaded sidebar-collapse"> <!--begin::App Wrapper-->
  31. <div class="app-wrapper"> <!--begin::Header-->
  32. <nav class="app-header navbar navbar-expand bg-body"> <!--begin::Container-->
  33. <div class="container-fluid"> <!--begin::Start Navbar Links-->
  34. <ul class="navbar-nav">
  35. <li class="nav-item"> <a class="nav-link" data-lte-toggle="sidebar" href="#" role="button"> <i
  36. class="bi bi-list"></i> </a> </li>
  37. <li class="nav-item d-none d-md-block"> <a href="{% url 'file-upload' %}" class="nav-link">Home</a> </li>
  38. <!-- <li class="nav-item d-none d-md-block"> <a href="#" class="nav-link">Contact</a> </li> -->
  39. </ul> <!--end::Start Navbar Links--> <!--begin::End Navbar Links-->
  40. <ul class="navbar-nav ms-auto"> <!--begin::Navbar Search-->
  41. <!-- <li class="nav-item"> <a class="nav-link" data-widget="navbar-search" href="search.html"
  42. role="button"> <i class="bi bi-search"></i> </a> </li>
  43. <li class="nav-item dropdown"> <a class="nav-link" data-bs-toggle="dropdown" href="#"> <i
  44. class="bi bi-bell-fill"></i> <span class="navbar-badge badge text-bg-warning">15</span>
  45. </a>
  46. <div class="dropdown-menu dropdown-menu-lg dropdown-menu-end"> <span
  47. class="dropdown-item dropdown-header">3 Notifications</span>
  48. <div class="dropdown-divider"></div> <a href="#" class="dropdown-item"> <i
  49. class="bi bi-people-fill me-2"></i> filename_22_09_2024.xml is ready for review.
  50. <span class="float-end text-secondary fs-7">1 hours</span> </a>
  51. <div class="dropdown-divider"></div> <a href="#" class="dropdown-item"> <i
  52. class="bi bi-people-fill me-2"></i> filename_22_09_2024.xml is uploaded
  53. successfully.
  54. <span class="float-end text-secondary fs-7">12 hours</span> </a>
  55. <div class="dropdown-divider"></div> <a href="#" class="dropdown-item"> <i
  56. class="bi bi-file-earmark-fill me-2"></i> filename_12_09_2024.xml is uploaded
  57. successfully.
  58. <span class="float-end text-secondary fs-7">2 days</span> </a>
  59. <div class="dropdown-divider"></div> <a href="#" class="dropdown-item dropdown-footer">
  60. See All Notifications
  61. </a>
  62. </div>
  63. </li> -->
  64. <li class="nav-item"> <a class="nav-link" href="#" data-lte-toggle="fullscreen"> <i
  65. data-lte-icon="maximize" class="bi bi-arrows-fullscreen"></i> <i
  66. data-lte-icon="minimize" class="bi bi-fullscreen-exit" style="display: none;"></i> </a>
  67. </li> <!--end::Fullscreen Toggle--> <!--begin::User Menu Dropdown-->
  68. <li class="nav-item dropdown user-menu"> <a href="#" class="nav-link dropdown-toggle"
  69. data-bs-toggle="dropdown"> <img src="{% static './images/user2-160x160.jpg' %}"
  70. class="user-image rounded-circle shadow" alt="User Image"> <span
  71. class="d-none d-md-inline">Arun Devar</span> </a>
  72. <ul class="dropdown-menu dropdown-menu-lg dropdown-menu-end"> <!--begin::User Image-->
  73. <li class="user-header text-bg-secondary"> <img src="{% static './images/user2-160x160.jpg' %}"
  74. class="rounded-circle shadow" alt="User Image">
  75. <p>
  76. Arun Devar - Senior Manager
  77. <small>Since Nov. 2023</small>
  78. </p>
  79. </li> <!--end::User Image--> <!--begin::Menu Body-->
  80. <li class="user-footer"> <a href="#" class="btn btn-default btn-flat">Profile</a> <a
  81. href="{% url 'logout' %}" class="btn btn-default btn-flat float-end">Sign out</a> </li>
  82. <!--end::Menu Footer-->
  83. </ul>
  84. </li> <!--end::User Menu Dropdown-->
  85. </ul> <!--end::End Navbar Links-->
  86. </div> <!--end::Container-->
  87. </nav> <!--end::Header--> <!--begin::Sidebar-->
  88. <aside class="app-sidebar shadow"> <!--begin::Sidebar Brand-->
  89. <div class="sidebar-brand"> <!--begin::Brand Link--> <a href="{% url 'file-upload' %}" class="brand-link">
  90. <!--begin::Brand Image--> <img src="{% static './images/logo-mini.png' %}" alt="Lumina Datamatics"
  91. class="brand-image logo-mini"> <!--end::Brand Image--> <!--begin::Brand Text--> <span
  92. class="brand-text fw-light"><img style="position:relative; left: -40px;"
  93. src="{% static './images/logo.png' %}" alt="Lumina Datamatics" class="brand-image"></span>
  94. <!--end::Brand Text--> </a>
  95. </div> <!--end::Sidebar Brand--> <!--begin::Sidebar Wrapper-->
  96. <div class="sidebar-wrapper">
  97. <nav class="mt-2"> <!--begin::Sidebar Menu-->
  98. <ul class="nav sidebar-menu flex-column" data-lte-toggle="treeview" role="menu"
  99. data-accordion="false">
  100. <li class="nav-item"> <a href="{% url 'file-upload' %}" class="nav-link"> <i
  101. class="nav-icon bi bi-upload"></i>
  102. <p>Upload</p>
  103. </a> </li>
  104. <li class="nav-item"> <a href="{% url 'tool-check' %}" class="nav-link active"> <i
  105. class="nav-icon bi bi-house"></i>
  106. <p>Home</p>
  107. </a> </li>
  108. </ul> <!--end::Sidebar Menu-->
  109. </nav>
  110. </div> <!--end::Sidebar Wrapper-->
  111. </aside> <!--end::Sidebar--> <!--begin::App Main-->
  112. <main class="app-main"> <!--begin::App Content Header-->
  113. <div class="app-content-header"> <!--begin::Container-->
  114. <div class="container-fluid"> <!--begin::Row-->
  115. <div class="row">
  116. <div class="col-sm-6">
  117. <h3 class="mb-0">Dashboard</h3>
  118. </div>
  119. <div class="col-sm-6">
  120. <ol class="breadcrumb float-sm-end">
  121. <li class="breadcrumb-item"><a href="./upload.html">Upload</a></li>
  122. <li class="breadcrumb-item active" aria-current="page">
  123. Dashboard
  124. </li>
  125. </ol>
  126. </div>
  127. </div> <!--end::Row-->
  128. </div> <!--end::Container-->
  129. </div>
  130. <div class="app-content"> <!--begin::Container-->
  131. <div class="container-fluid"> <!-- Info boxes -->
  132. <div id="html"></div>
  133. <div class="row mt-5">
  134. <div class="col-sm-12 text-center">
  135. <button class="btn btn-primary wow lightSpeedIn" data-wow-delay="1s"
  136. onclick="$(this).hide();$('.after_score').removeClass('d-none');">AI
  137. Fix Issues</button>
  138. </div>
  139. </div>
  140. </div> <!--end::Row--> <!--begin::Row-->
  141. </div> <!--end::Container-->
  142. </main> <!--end::App Main--> <!--begin::Footer-->
  143. <footer class="app-footer"> <!--begin::To the end-->
  144. <!-- <div class="float-end d-none d-sm-inline">Anything you want</div>--> <!--end::To the end-->
  145. <!--begin::Copyright--> <strong>
  146. Copyright &copy; 2014-2024&nbsp;
  147. <a href="https://www.luminadatamatics.com/" target="_blank" class="text-decoration-none">Lumina
  148. Datamatics
  149. LTD</a>.
  150. </strong>
  151. All rights reserved.
  152. <!--end::Copyright-->
  153. </footer> <!--end::Footer-->
  154. </div> <!--end::App Wrapper--> <!--begin::Script--> <!--begin::Third Party Plugin(OverlayScrollbars)-->
  155. <script src="https://code.jquery.com/jquery-3.7.1.min.js"
  156. integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script>
  157. <script src="https://cdn.jsdelivr.net/npm/overlayscrollbars@2.3.0/browser/overlayscrollbars.browser.es6.min.js"
  158. integrity="sha256-H2VM7BKda+v2Z4+DRy69uknwxjyDRhszjXFhsL4gD3w=" crossorigin="anonymous"></script>
  159. <!--end::Third Party Plugin(OverlayScrollbars)--><!--begin::Required Plugin(popperjs for Bootstrap 5)-->
  160. <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.8/dist/umd/popper.min.js"
  161. integrity="sha256-whL0tQWoY1Ku1iskqPFvmZ+CHsvmRWx/PIoEvIeWh4I=" crossorigin="anonymous"></script>
  162. <!--end::Required Plugin(popperjs for Bootstrap 5)--><!--begin::Required Plugin(Bootstrap 5)-->
  163. <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.min.js"
  164. integrity="sha256-YMa+wAM6QkVyz999odX7lPRxkoYAan8suedu4k2Zur8=" crossorigin="anonymous"></script>
  165. <!--end::Required Plugin(Bootstrap 5)--><!--begin::Required Plugin(AdminLTE)-->
  166. <script src="{% static './js/adminlte.js' %}"></script>
  167. <!--end::Required Plugin(AdminLTE)--><!--begin::OverlayScrollbars Configure-->
  168. <script>
  169. const SELECTOR_SIDEBAR_WRAPPER = ".sidebar-wrapper";
  170. const Default = {
  171. scrollbarTheme: "os-theme-light",
  172. scrollbarAutoHide: "leave",
  173. scrollbarClickScroll: true,
  174. };
  175. document.addEventListener("DOMContentLoaded", function () {
  176. const sidebarWrapper = document.querySelector(SELECTOR_SIDEBAR_WRAPPER);
  177. if (
  178. sidebarWrapper &&
  179. typeof OverlayScrollbarsGlobal?.OverlayScrollbars !== "undefined"
  180. ) {
  181. OverlayScrollbarsGlobal.OverlayScrollbars(sidebarWrapper, {
  182. scrollbars: {
  183. theme: Default.scrollbarTheme,
  184. autoHide: Default.scrollbarAutoHide,
  185. clickScroll: Default.scrollbarClickScroll,
  186. },
  187. });
  188. }
  189. });
  190. </script> <!--end::OverlayScrollbars Configure--> <!-- OPTIONAL SCRIPTS --> <!-- apexcharts -->
  191. <script src="https://cdnjs.cloudflare.com/ajax/libs/jQuery-Knob/1.2.13/jquery.knob.min.js"
  192. integrity="sha512-NhRZzPdzMOMf005Xmd4JonwPftz4Pe99mRVcFeRDcdCtfjv46zPIi/7ZKScbpHD/V0HB1Eb+ZWigMqw94VUVaw=="
  193. crossorigin="anonymous" referrerpolicy="no-referrer"></script>
  194. <!-- <script src="{% static 'dist/WOW-master/dist/wow.js' %}"></script> -->
  195. <script>
  196. document.addEventListener('DOMContentLoaded', function () {
  197. // const responseDiv = document.getElementById('batchScoreMessage');
  198. fetch('/core/api/batch-score/', {
  199. method: 'GET', // or 'POST' if your API expects POST
  200. headers: {
  201. 'X-CSRFToken': document.querySelector('[name=csrfmiddlewaretoken]')?.value || ''
  202. }
  203. })
  204. .then(response => response.json())
  205. .then(data => {
  206. if (data.success) {
  207. var html = '';
  208. data.results.forEach(element => {
  209. // console.log(element.final_score);
  210. var initial_score = '';
  211. var after_score = ''
  212. var base_keys = { 'Title': 'title_quality', 'Description': 'description_quality', 'Image': 'image_score', 'SEO': 'seo_discoverability', 'Attributes': 'attributes' }
  213. Object.entries(base_keys).forEach(([key, value]) => {
  214. let name = key;
  215. key = key.toLowerCase();
  216. console.log(element.breakdown[value], value);
  217. var per = 0
  218. if (element.breakdown[value]) {
  219. per = element.breakdown[value];
  220. }
  221. var intial_desc = '';
  222. if (element.categorized_feedback[key]) {
  223. // console.log(element.categorized_feedback[key].issues);
  224. intial_desc = element.categorized_feedback[key].issues.join(', ');
  225. }
  226. initial_score += `<tr>
  227. <td class="wow bounceInLeft">
  228. <a>
  229. `+ name + `
  230. </a>
  231. </td>
  232. <td class="project_progress wow bounceInRight">
  233. <div class="progress progress-sm">
  234. <div class="progress-bar bg-green" role="progressbar"
  235. aria-valuenow="`+ per + `" aria-valuemin="0" aria-valuemax="100"
  236. style="width: `+ per + `%">
  237. </div>
  238. </div>
  239. <small>
  240. `+ per + `%
  241. </small>
  242. </td>
  243. </tr>
  244. <tr>
  245. <td class="wow bounceInLeft" colspan='2' data-wow-delay="0.2s">
  246. <div style='max-height:50px;overflow-y:auto;'>
  247. <small>
  248. `+ intial_desc + `
  249. </small>
  250. </div>
  251. </td>
  252. </tr>`;
  253. })
  254. Object.keys(base_keys).forEach(k => {
  255. let name = k;
  256. k = k.toLowerCase();
  257. var ik = 'improved_' + k
  258. var after_desc = '';
  259. if (element.ai_suggestions.content[ik]) {
  260. console.log(element.ai_suggestions.content);
  261. after_desc = element.ai_suggestions.content[ik];
  262. }
  263. after_score += `<tr>
  264. <td class="wow bounceInLeft">
  265. <a>
  266. `+ name + `
  267. </a>
  268. </td>
  269. </tr>
  270. <tr>
  271. <td class="wow bounceInLeft" colspan='2' data-wow-delay="0.2s">
  272. <div style='max-height:50px;overflow-y:auto;'>
  273. <small>
  274. `+ after_desc + `
  275. </small>
  276. </div>
  277. </td>
  278. </tr>`;
  279. })
  280. html += `<div class="row mb-4" >
  281. <div class="col-md-4">
  282. <div class="card">
  283. <img class="card-img-top wow pulse" data-wow-iteration="2"
  284. src="`+element.image_path+`">
  285. <div class="card-block">
  286. <h4 class="card-title wow bounceInLeft" data-wow-delay="0.1s">`+element.title+`</h4>
  287. <div class="card-text wow bounceInLeft" data-wow-delay="0.2s">`+element.description+`</div>
  288. </div>
  289. <div class="card-footer wow bounceInLeft" data-wow-delay="0.3s">
  290. <small>`+element.created_at+`</small>
  291. </div>
  292. </div>
  293. </div>
  294. <div class="col-md-4">
  295. <div class="card">
  296. <div class="card-header py-2">
  297. <div class="text-sm mb-0">Initial Score</div>
  298. </div>
  299. <div class="card-body text-center wow bounceInDown" data-wow-iteration="0.5">
  300. <input type="text" class="dial" value="`+ element.final_score + `" data-width="120" data-height="120"
  301. data-readOnly='true' data-fgColor="#3c8dbc" data-bgColor="#e8e8e8"
  302. data-thickness=".2">
  303. <div class="mt-2">Overall Score</div>
  304. </div>
  305. <table class="table table-striped projects mb-0 table-sm">
  306. <tbody>
  307. `+ initial_score + `
  308. </tbody>
  309. </table>
  310. </div>
  311. </div>
  312. <div class="col-md-4 after_score d-none">
  313. <div class="card">
  314. <div class="card-header py-2">
  315. <div class="text-sm mb-0">After Score</div>
  316. </div>
  317. <div class="card-body text-center wow bounceInDown" data-wow-iteration="0.5">
  318. <input type="text" class="dial" value="`+ element.ai_suggestions.content.quality_score_prediction + `" data-width="120" data-height="120"
  319. data-readOnly='true' data-fgColor="#198754" data-bgColor="#e8e8e8"
  320. data-thickness=".2">
  321. <div class="mt-2">Overall Score</div>
  322. </div>
  323. <table class="table table-striped projects mb-0 table-sm">
  324. <tbody>
  325. `+ after_score + `
  326. </tbody>
  327. </table>
  328. </div>
  329. </div>
  330. </div > `;
  331. // console.log('werrrrrrrrrrrrrrrrrrr', html);
  332. });
  333. $('#html').html(html);
  334. $('.dial').knob();
  335. // });
  336. new WOW().init();
  337. // responseDiv.innerHTML = `<div class="alert alert-success">✅ ${data.message}</div>`;
  338. } else {
  339. // responseDiv.innerHTML = `<div class="alert alert-danger">❌ ${data.error}</div>`;
  340. }
  341. // Remove message after 5 seconds
  342. // setTimeout(() => {
  343. // responseDiv.innerHTML = '';
  344. // }, 5000);
  345. })
  346. .catch(error => {
  347. // responseDiv.innerHTML = `<div class="alert alert-danger">❌ API call failed: ${error}</div>`;
  348. // setTimeout(() => {
  349. // responseDiv.innerHTML = '';
  350. // }, 5000);
  351. });
  352. });
  353. </script>
  354. </body><!--end::Body-->
  355. </html>