get-data.html 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469
  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. <style>
  30. #full-page-loader {
  31. position: fixed;
  32. top: 0;
  33. left: 0;
  34. width: 100%;
  35. height: 100%;
  36. background-color: rgba(0, 0, 0, 0.6); /* semi-transparent black */
  37. z-index: 9999;
  38. display: flex;
  39. justify-content: center;
  40. align-items: center;
  41. }
  42. .loader-overlay .spinner-border {
  43. width: 3rem;
  44. height: 3rem;
  45. }
  46. </style>
  47. </head>
  48. <body class="layout-fixed sidebar-expand-lg sidebar-mini app-loaded sidebar-collapse"> <!--begin::App Wrapper-->
  49. <div class="app-wrapper"> <!--begin::Header-->
  50. <nav class="app-header navbar navbar-expand bg-body"> <!--begin::Container-->
  51. <div class="container-fluid"> <!--begin::Start Navbar Links-->
  52. <ul class="navbar-nav">
  53. <li class="nav-item"> <a class="nav-link" data-lte-toggle="sidebar" href="#" role="button"> <i
  54. class="bi bi-list"></i> </a> </li>
  55. <li class="nav-item d-none d-md-block"> <a href="{% url 'file-upload' %}" class="nav-link">Home</a> </li>
  56. <!-- <li class="nav-item d-none d-md-block"> <a href="#" class="nav-link">Contact</a> </li> -->
  57. </ul> <!--end::Start Navbar Links--> <!--begin::End Navbar Links-->
  58. <ul class="navbar-nav ms-auto"> <!--begin::Navbar Search-->
  59. <!-- <li class="nav-item"> <a class="nav-link" data-widget="navbar-search" href="search.html"
  60. role="button"> <i class="bi bi-search"></i> </a> </li>
  61. <li class="nav-item dropdown"> <a class="nav-link" data-bs-toggle="dropdown" href="#"> <i
  62. class="bi bi-bell-fill"></i> <span class="navbar-badge badge text-bg-warning">15</span>
  63. </a>
  64. <div class="dropdown-menu dropdown-menu-lg dropdown-menu-end"> <span
  65. class="dropdown-item dropdown-header">3 Notifications</span>
  66. <div class="dropdown-divider"></div> <a href="#" class="dropdown-item"> <i
  67. class="bi bi-people-fill me-2"></i> filename_22_09_2024.xml is ready for review.
  68. <span class="float-end text-secondary fs-7">1 hours</span> </a>
  69. <div class="dropdown-divider"></div> <a href="#" class="dropdown-item"> <i
  70. class="bi bi-people-fill me-2"></i> filename_22_09_2024.xml is uploaded
  71. successfully.
  72. <span class="float-end text-secondary fs-7">12 hours</span> </a>
  73. <div class="dropdown-divider"></div> <a href="#" class="dropdown-item"> <i
  74. class="bi bi-file-earmark-fill me-2"></i> filename_12_09_2024.xml is uploaded
  75. successfully.
  76. <span class="float-end text-secondary fs-7">2 days</span> </a>
  77. <div class="dropdown-divider"></div> <a href="#" class="dropdown-item dropdown-footer">
  78. See All Notifications
  79. </a>
  80. </div>
  81. </li> -->
  82. <li class="nav-item"> <a class="nav-link" href="#" data-lte-toggle="fullscreen"> <i
  83. data-lte-icon="maximize" class="bi bi-arrows-fullscreen"></i> <i
  84. data-lte-icon="minimize" class="bi bi-fullscreen-exit" style="display: none;"></i> </a>
  85. </li> <!--end::Fullscreen Toggle--> <!--begin::User Menu Dropdown-->
  86. <li class="nav-item dropdown user-menu"> <a href="#" class="nav-link dropdown-toggle"
  87. data-bs-toggle="dropdown"> <img src="{% static './images/user2-160x160.jpg' %}"
  88. class="user-image rounded-circle shadow" alt="User Image"> <span
  89. class="d-none d-md-inline">Arun Devar</span> </a>
  90. <ul class="dropdown-menu dropdown-menu-lg dropdown-menu-end"> <!--begin::User Image-->
  91. <li class="user-header text-bg-secondary"> <img src="{% static './images/user2-160x160.jpg' %}"
  92. class="rounded-circle shadow" alt="User Image">
  93. <p>
  94. Arun Devar - Senior Manager
  95. <small>Since Nov. 2023</small>
  96. </p>
  97. </li> <!--end::User Image--> <!--begin::Menu Body-->
  98. <li class="user-footer"> <a href="#" class="btn btn-default btn-flat">Profile</a> <a
  99. href="{% url 'logout' %}" class="btn btn-default btn-flat float-end">Sign out</a> </li>
  100. <!--end::Menu Footer-->
  101. </ul>
  102. </li> <!--end::User Menu Dropdown-->
  103. </ul> <!--end::End Navbar Links-->
  104. </div> <!--end::Container-->
  105. </nav> <!--end::Header--> <!--begin::Sidebar-->
  106. <aside class="app-sidebar shadow"> <!--begin::Sidebar Brand-->
  107. <div class="sidebar-brand"> <!--begin::Brand Link--> <a href="{% url 'file-upload' %}" class="brand-link">
  108. <!--begin::Brand Image--> <img src="{% static './images/logo-mini.png' %}" alt="Lumina Datamatics"
  109. class="brand-image logo-mini"> <!--end::Brand Image--> <!--begin::Brand Text--> <span
  110. class="brand-text fw-light"><img style="position:relative; left: -40px;"
  111. src="{% static './images/logo.png' %}" alt="Lumina Datamatics" class="brand-image"></span>
  112. <!--end::Brand Text--> </a>
  113. </div> <!--end::Sidebar Brand--> <!--begin::Sidebar Wrapper-->
  114. <div class="sidebar-wrapper">
  115. <nav class="mt-2"> <!--begin::Sidebar Menu-->
  116. <ul class="nav sidebar-menu flex-column" data-lte-toggle="treeview" role="menu"
  117. data-accordion="false">
  118. <li class="nav-item"> <a href="{% url 'file-upload' %}" class="nav-link"> <i
  119. class="nav-icon bi bi-upload"></i>
  120. <p>Upload</p>
  121. </a> </li>
  122. <li class="nav-item"> <a href="{% url 'tool-check' %}" class="nav-link active"> <i
  123. class="nav-icon bi bi-house"></i>
  124. <p>Home</p>
  125. </a> </li>
  126. </ul> <!--end::Sidebar Menu-->
  127. </nav>
  128. </div> <!--end::Sidebar Wrapper-->
  129. </aside> <!--end::Sidebar--> <!--begin::App Main-->
  130. <main class="app-main"> <!--begin::App Content Header-->
  131. <div class="app-content-header"> <!--begin::Container-->
  132. <div class="container-fluid"> <!--begin::Row-->
  133. <div class="row">
  134. <div class="col-sm-6">
  135. <h3 class="mb-0">Dashboard</h3>
  136. </div>
  137. <div class="col-sm-6">
  138. <ol class="breadcrumb float-sm-end">
  139. <li class="breadcrumb-item"><a href="./upload.html">Upload</a></li>
  140. <li class="breadcrumb-item active" aria-current="page">
  141. Dashboard
  142. </li>
  143. </ol>
  144. </div>
  145. </div> <!--end::Row-->
  146. </div> <!--end::Container-->
  147. </div>
  148. <div class="app-content"> <!--begin::Container-->
  149. <div class="container-fluid"> <!-- Info boxes -->
  150. <!-- Full Page Loader -->
  151. <div id="full-page-loader" style="display: none;">
  152. <div class="loader-overlay">
  153. <div class="spinner-border text-light" role="status">
  154. <!-- <span class="sr-only">Loading...</span> -->
  155. </div>
  156. </div>
  157. </div>
  158. <div id="html"></div>
  159. <div class="row mt-5 ai-fix-issues-button" style="display: none;">
  160. <div class="col-sm-12 text-center">
  161. <button class="btn btn-primary wow lightSpeedIn" data-wow-delay="1s"
  162. onclick="$(this).hide();$('.after_score').removeClass('d-none');">AI
  163. Fix Issues</button>
  164. </div>
  165. </div>
  166. </div> <!--end::Row--> <!--begin::Row-->
  167. <!-- Loader (initially hidden) -->
  168. <!-- <div id="ai-loader" class="spinner-border text-primary mt-3" role="status" style="display: none;">
  169. <span class="sr-only">Loading...</span>
  170. </div> -->
  171. </div> <!--end::Container-->
  172. </main> <!--end::App Main--> <!--begin::Footer-->
  173. <footer class="app-footer"> <!--begin::To the end-->
  174. <!-- <div class="float-end d-none d-sm-inline">Anything you want</div>--> <!--end::To the end-->
  175. <!--begin::Copyright--> <strong>
  176. Copyright &copy; 2014-2024&nbsp;
  177. <a href="https://www.luminadatamatics.com/" target="_blank" class="text-decoration-none">Lumina
  178. Datamatics
  179. LTD</a>.
  180. </strong>
  181. All rights reserved.
  182. <!--end::Copyright-->
  183. </footer> <!--end::Footer-->
  184. </div> <!--end::App Wrapper--> <!--begin::Script--> <!--begin::Third Party Plugin(OverlayScrollbars)-->
  185. <script src="https://code.jquery.com/jquery-3.7.1.min.js"
  186. integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script>
  187. <script src="https://cdn.jsdelivr.net/npm/overlayscrollbars@2.3.0/browser/overlayscrollbars.browser.es6.min.js"
  188. integrity="sha256-H2VM7BKda+v2Z4+DRy69uknwxjyDRhszjXFhsL4gD3w=" crossorigin="anonymous"></script>
  189. <!--end::Third Party Plugin(OverlayScrollbars)--><!--begin::Required Plugin(popperjs for Bootstrap 5)-->
  190. <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.8/dist/umd/popper.min.js"
  191. integrity="sha256-whL0tQWoY1Ku1iskqPFvmZ+CHsvmRWx/PIoEvIeWh4I=" crossorigin="anonymous"></script>
  192. <!--end::Required Plugin(popperjs for Bootstrap 5)--><!--begin::Required Plugin(Bootstrap 5)-->
  193. <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.min.js"
  194. integrity="sha256-YMa+wAM6QkVyz999odX7lPRxkoYAan8suedu4k2Zur8=" crossorigin="anonymous"></script>
  195. <!--end::Required Plugin(Bootstrap 5)--><!--begin::Required Plugin(AdminLTE)-->
  196. <script src="{% static './js/adminlte.js' %}"></script>
  197. <!--end::Required Plugin(AdminLTE)--><!--begin::OverlayScrollbars Configure-->
  198. <script>
  199. const SELECTOR_SIDEBAR_WRAPPER = ".sidebar-wrapper";
  200. const Default = {
  201. scrollbarTheme: "os-theme-light",
  202. scrollbarAutoHide: "leave",
  203. scrollbarClickScroll: true,
  204. };
  205. document.addEventListener("DOMContentLoaded", function () {
  206. const sidebarWrapper = document.querySelector(SELECTOR_SIDEBAR_WRAPPER);
  207. if (
  208. sidebarWrapper &&
  209. typeof OverlayScrollbarsGlobal?.OverlayScrollbars !== "undefined"
  210. ) {
  211. OverlayScrollbarsGlobal.OverlayScrollbars(sidebarWrapper, {
  212. scrollbars: {
  213. theme: Default.scrollbarTheme,
  214. autoHide: Default.scrollbarAutoHide,
  215. clickScroll: Default.scrollbarClickScroll,
  216. },
  217. });
  218. }
  219. });
  220. </script> <!--end::OverlayScrollbars Configure--> <!-- OPTIONAL SCRIPTS --> <!-- apexcharts -->
  221. <script src="https://cdnjs.cloudflare.com/ajax/libs/jQuery-Knob/1.2.13/jquery.knob.min.js"
  222. integrity="sha512-NhRZzPdzMOMf005Xmd4JonwPftz4Pe99mRVcFeRDcdCtfjv46zPIi/7ZKScbpHD/V0HB1Eb+ZWigMqw94VUVaw=="
  223. crossorigin="anonymous" referrerpolicy="no-referrer"></script>
  224. <!-- <script src="{% static 'dist/WOW-master/dist/wow.js' %}"></script> -->
  225. <script>
  226. const mediaUrl = "./../media/";
  227. console.log("mediaUrl",mediaUrl);
  228. document.addEventListener('DOMContentLoaded', function () {
  229. // const responseDiv = document.getElementById('batchScoreMessage');
  230. // Show loader
  231. $('#full-page-loader').show();
  232. fetch('/core/api/batch-score/', {
  233. method: 'GET', // or 'POST' if your API expects POST
  234. headers: {
  235. 'X-CSRFToken': document.querySelector('[name=csrfmiddlewaretoken]')?.value || ''
  236. }
  237. })
  238. .then(response => response.json())
  239. .then(data => {
  240. if (data.success) {
  241. var html = '';
  242. data.results.forEach(element => {
  243. // console.log(element.final_score);
  244. var initial_score = '';
  245. var after_score = ''
  246. var base_keys = { 'Title': 'title_quality', 'Description': 'description_quality', 'Image': 'image_score', 'Attributes': 'attributes' }
  247. Object.entries(base_keys).forEach(([key, value]) => {
  248. let name = key;
  249. key = key.toLowerCase();
  250. console.log(element.breakdown[value], value);
  251. var per = 0
  252. if (element.breakdown[value]) {
  253. per = element.breakdown[value];
  254. }
  255. var intial_desc = '';
  256. if (element.categorized_feedback[key]) {
  257. // console.log(element.categorized_feedback[key].issues);
  258. intial_desc = element.categorized_feedback[key].issues.join(', ');
  259. }
  260. initial_score += `<tr>
  261. <td class="wow bounceInLeft">
  262. <a>
  263. `+ name + `
  264. </a>
  265. </td>
  266. <td class="project_progress wow bounceInRight">
  267. <div class="progress progress-sm">
  268. <div class="progress-bar bg-green" role="progressbar"
  269. aria-valuenow="`+ per + `" aria-valuemin="0" aria-valuemax="100"
  270. style="width: `+ per + `%">
  271. </div>
  272. </div>
  273. <small>
  274. `+ per + `%
  275. </small>
  276. </td>
  277. </tr>
  278. <tr>
  279. <td class="wow bounceInLeft" colspan='2' data-wow-delay="0.2s">
  280. <div style='max-height:100px;overflow-y:auto;'>
  281. <small>
  282. `+ intial_desc + `
  283. </small>
  284. </div>
  285. </td>
  286. </tr>`;
  287. })
  288. Object.keys(base_keys).forEach(k => {
  289. let name = k;
  290. k = k.toLowerCase();
  291. var ik = 'improved_' + k
  292. console.log("ik",ik);
  293. var after_desc = '';
  294. if (element.ai_suggestions.content[ik]) {
  295. console.log(element.ai_suggestions.content);
  296. after_desc = element.ai_suggestions.content[ik];
  297. }
  298. let missing_attributes = '';
  299. if(k == "attributes"){
  300. if(element?.ai_suggestions?.content?.missing_attributes){
  301. Object.entries(element?.ai_suggestions?.content?.missing_attributes).forEach(([key, value]) => {
  302. missing_attributes += `<li><span class="attribute-label">${key}:</span> ${value}</li>`
  303. });
  304. }
  305. }
  306. if(k == "image"){
  307. after_score += `<tr>
  308. <td class="wow bounceInLeft">
  309. <a>
  310. `+ name + ` Note
  311. </a>
  312. </td>
  313. </tr>
  314. <tr>
  315. <td class="wow bounceInLeft" colspan='2' data-wow-delay="0.2s">
  316. <div style='max-height:100px;overflow-y:auto;'>
  317. <small>
  318. `+ element?.ai_suggestions?.image?.note + `
  319. </small>
  320. </div>
  321. </td>
  322. </tr>`;
  323. }else if(k == "attributes"){
  324. after_score += `<tr>
  325. <td class="wow bounceInLeft">
  326. <a>
  327. Missing `+ name + `
  328. </a>
  329. </td>
  330. </tr>
  331. <tr>
  332. <td class="wow bounceInLeft" colspan='2' data-wow-delay="0.2s">
  333. <div style='max-height:100px;overflow-y:auto;'>
  334. <small> <ul>
  335. `+ missing_attributes + `
  336. </ul></small>
  337. </div>
  338. </td>
  339. </tr>`;
  340. }else{
  341. after_score += `<tr>
  342. <td class="wow bounceInLeft">
  343. <a>
  344. `+ name + `
  345. </a>
  346. </td>
  347. </tr>
  348. <tr>
  349. <td class="wow bounceInLeft" colspan='2' data-wow-delay="0.2s">
  350. <div style='max-height:100px;overflow-y:auto;'>
  351. <small>
  352. `+ after_desc + `
  353. </small>
  354. </div>
  355. </td>
  356. </tr>`;
  357. }
  358. })
  359. html += `<div class="row mb-4" >
  360. <div class="col-md-4">
  361. <div class="card">
  362. <img class="card-img-top wow pulse" data-wow-iteration="2"
  363. src="`+mediaUrl+element.image_path+`">
  364. <div class="card-block">
  365. <h4 class="card-title wow bounceInLeft" data-wow-delay="0.1s">`+element.title+`</h4>
  366. <div class="card-text wow bounceInLeft" data-wow-delay="0.2s">`+element.description+`</div>
  367. </div>
  368. <div class="card-footer wow bounceInLeft" data-wow-delay="0.3s">
  369. <small>`+element.created_at+`</small>
  370. </div>
  371. </div>
  372. </div>
  373. <div class="col-md-4">
  374. <div class="card">
  375. <div class="card-header py-2">
  376. <div class="text-sm mb-0">Initial Score</div>
  377. </div>
  378. <div class="card-body text-center wow bounceInDown" data-wow-iteration="0.5">
  379. <input type="text" class="dial" value="`+ element.final_score + `" data-width="120" data-height="120"
  380. data-readOnly='true' data-fgColor="#3c8dbc" data-bgColor="#e8e8e8"
  381. data-thickness=".2">
  382. <div class="mt-2">Overall Score</div>
  383. </div>
  384. <table class="table table-striped projects mb-0 table-sm">
  385. <tbody>
  386. `+ initial_score + `
  387. </tbody>
  388. </table>
  389. </div>
  390. </div>
  391. <div class="col-md-4 after_score d-none">
  392. <div class="card">
  393. <div class="card-header py-2">
  394. <div class="text-sm mb-0">Forecasted Score</div>
  395. </div>
  396. <div class="card-body text-center wow bounceInDown" data-wow-iteration="0.5">
  397. <input type="text" class="dial" value="`+ element.ai_suggestions.content.quality_score_prediction + `" data-width="120" data-height="120"
  398. data-readOnly='true' data-fgColor="#198754" data-bgColor="#e8e8e8"
  399. data-thickness=".2">
  400. <div class="mt-2">Overall Score</div>
  401. </div>
  402. <table class="table table-striped projects mb-0 table-sm">
  403. <tbody>
  404. `+ after_score + `
  405. </tbody>
  406. </table>
  407. </div>
  408. </div>
  409. </div > `;
  410. // console.log('werrrrrrrrrrrrrrrrrrr', html);
  411. });
  412. $('#html').html(html);
  413. $('.dial').knob();
  414. document.querySelector('.ai-fix-issues-button').style.display = 'block';
  415. $('#full-page-loader').hide();
  416. // });
  417. new WOW().init();
  418. // responseDiv.innerHTML = `<div class="alert alert-success">✅ ${data.message}</div>`;
  419. } else {
  420. // responseDiv.innerHTML = `<div class="alert alert-danger">❌ ${data.error}</div>`;
  421. }
  422. // Remove message after 5 seconds
  423. // setTimeout(() => {
  424. // responseDiv.innerHTML = '';
  425. // }, 5000);
  426. })
  427. .catch(error => {
  428. // responseDiv.innerHTML = `<div class="alert alert-danger">❌ API call failed: ${error}</div>`;
  429. // setTimeout(() => {
  430. // responseDiv.innerHTML = '';
  431. // }, 5000);
  432. });
  433. });
  434. </script>
  435. </body><!--end::Body-->
  436. </html>