From e37f48da37e02451309003a0100a33b7e1741cd3 Mon Sep 17 00:00:00 2001 From: Jordy van Zeeland Date: Thu, 29 Sep 2022 16:18:35 +0200 Subject: [PATCH] First view books per month per genre --- README.md | 2 + graph.png | Bin 0 -> 120282 bytes ras/api/urls.py | 4 +- ras/api/views.py | 42 ++++++++----- ras/frontend/src/App.js | 97 ++++++++++++++++++++++++------ ras/frontend/static/js/main.js | 2 +- ras/frontend/templates/index.html | 11 ++++ 7 files changed, 121 insertions(+), 37 deletions(-) create mode 100644 graph.png diff --git a/README.md b/README.md index c65a6c7..f085fa7 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +![alt text](./graph.png) + # Reading Analytics System Analytics system of my reading progress diff --git a/graph.png b/graph.png new file mode 100644 index 0000000000000000000000000000000000000000..b3aa7c804805af5fd21a38ab4cccd28e8d8d2b46 GIT binary patch literal 120282 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

bP1v^a#-h# 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 literal 0 HcmV?d00001 diff --git a/ras/api/urls.py b/ras/api/urls.py index 6982d8e..0e2ae9e 100644 --- a/ras/api/urls.py +++ b/ras/api/urls.py @@ -2,6 +2,6 @@ from django.urls import path from .views import * urlpatterns = [ - path('books', api_all_books), - path('books/genres', books_per_genre_per_month) + path('books/genres', books_per_genre_per_month), + path('ratings', avg_ratings_per_month) ] \ No newline at end of file diff --git a/ras/api/views.py b/ras/api/views.py index 3cfee69..6d878cb 100644 --- a/ras/api/views.py +++ b/ras/api/views.py @@ -8,22 +8,6 @@ from django.db.models import Q from django.templatetags.static import static import json -@api_view(['GET']) -def api_all_books(request): - df = pd.read_csv("api/static/books2.csv", encoding = "utf-8") - books = [] - for book in df['Books']: - info = book.split(';') - books.append({ - "name": info[0], - "author": info[1], - "genre": info[2], - "pages": info[3], - "readed": info[4], - "rating": info[5] - }) - return Response(books) - @api_view(['GET']) def books_per_genre_per_month(request): @@ -50,6 +34,32 @@ def books_per_genre_per_month(request): "count": row['count'] }) + return Response(data) + else: + return Response("No year header included") + +@api_view(['GET']) +def avg_ratings_per_month(request): + datayear = request.META.get('HTTP_YEAR') + + if datayear: + data = [] + + # Get CSV file with book data + df = pd.read_csv("api/static/books2.csv", encoding = "utf-8", header = 0, sep=';') + + # Filter data on year + df = df.where(df['readed'].str.contains(datayear)) + + avgratingspermonth = df.groupby('readed')['rating'].mean().reset_index(name="rating") + + for index, row in avgratingspermonth.iterrows(): + + data.append({ + "date": row['readed'], + "rating": int(row['rating']) + }) + return Response(data) else: return Response("No year header included") \ No newline at end of file diff --git a/ras/frontend/src/App.js b/ras/frontend/src/App.js index 22b4c0f..4f1a1e2 100644 --- a/ras/frontend/src/App.js +++ b/ras/frontend/src/App.js @@ -5,15 +5,21 @@ export default class App extends Component { super(props); } - initChart(data, year) { + initChart(data, ratings, year) { + + /* + ---------------------------------- + Books per month per genre + ---------------------------------- + */ var genres = []; var colors = [ - '#d0b2cf', '#b66f2b', '#003C72', '#ecdb0e' + '#696ffc', '#7596fa', '#92adfe', '#abc0ff' ] - var dataSet = []; + var dataSet = []; data.forEach(book => { if (!genres.includes(book.genre)) { @@ -48,11 +54,51 @@ export default class App extends Component { dataSet.push({ label: genre, data: genreData, - backgroundColor: colors[index] + backgroundColor: colors[index], + order: 2 }) }) } + /* + ---------------------------------- + Avarage ratings per month + ---------------------------------- + */ + + var avgRatings = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; + + for (var j = 0; j < 12; j++) { + + if (j < 9) { + var month = "0" + (j + 1) + } else { + month = (j + 1) + } + + for (var i = 0; i < ratings.length; i++) { + if (ratings[i].date == month + '-' + year) { + avgRatings[j] = ratings[i].rating; + } + } + } + + dataSet.push({ + label: 'Gemiddelde beoordeling', + data: avgRatings, + backgroundColor: '#ffa500', + borderColor: '#ffa500', + tension: 0.4, + type: 'line', + order: 1 + }) + + /* + ---------------------------------- + Stacked bar chart + ---------------------------------- + */ + new Chart(document.getElementById('chart'), { type: 'bar', data: { @@ -60,29 +106,37 @@ export default class App extends Component { datasets: dataSet }, options: { + responsive: true, + showTooltips: true, legend: { display: true, }, - tooltips: { - mode: 'index', - intersect: true, - axis: 'y' + interaction: { + mode: 'index' }, scales: { x: { ticks: { beginAtZero: true, - + color: "white", }, stacked: true, }, y: { ticks: { beginAtZero: true, - stepSize: 1 + stepSize: 1, + color: "white", }, stacked: true } + }, + plugins: { + legend: { + labels: { + color: "white" + } + } } } }); @@ -90,9 +144,7 @@ export default class App extends Component { componentDidMount() { - var currentyear = new Date().getFullYear() - - console.log(currentyear); + var currentyear = new Date("2021-09-29").getFullYear() fetch('/api/books/genres', { "method": "GET", @@ -101,17 +153,26 @@ export default class App extends Component { } }) .then(response => response.json()) - .then(data => { - this.initChart(data, currentyear); - console.log(data); + .then(books => { + fetch('/api/ratings', { + "method": "GET", + "headers": { + "year": currentyear + } + }) + .then(response => response.json()) + .then(ratings => { + console.log(ratings); + this.initChart(books, ratings, currentyear); + }) + }) } render() { return ( - -

Soon here comes the Reading Analytics System! test

+
) diff --git a/ras/frontend/static/js/main.js b/ras/frontend/static/js/main.js index 0d564f8..60fa102 100644 --- a/ras/frontend/static/js/main.js +++ b/ras/frontend/static/js/main.js @@ -1,2 +1,2 @@ /*! For license information please see main.js.LICENSE.txt */ -(()=>{"use strict";var __webpack_modules__={"./src/App.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (/* binding */ App)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\nclass App extends react__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor(props) {\n super(props);\n }\n\n initChart(data, year) {\n var genres = [];\n var colors = [\'#d0b2cf\', \'#b66f2b\', \'#003C72\', \'#ecdb0e\'];\n var dataSet = [];\n data.forEach(book => {\n if (!genres.includes(book.genre)) {\n genres.push(book.genre);\n }\n });\n\n if (genres && genres.length > 0) {\n genres.forEach((genre, index) => {\n var genreData = [];\n\n for (var i = 0; i < 12; i++) {\n genreData[i] = 0;\n\n if (i + 1 < 10) {\n var month = "0" + (i + 1);\n } else {\n month = i + 1;\n }\n\n for (var j = 0; j < data.length; j++) {\n if (data && data[j] && data[j].readed == month + \'-\' + year) {\n if (data[j].genre == genre) {\n genreData[i] = data[j].count;\n }\n }\n }\n }\n\n dataSet.push({\n label: genre,\n data: genreData,\n backgroundColor: colors[index]\n });\n });\n }\n\n new Chart(document.getElementById(\'chart\'), {\n type: \'bar\',\n data: {\n labels: ["Januari", "Februari", "Maart", "April", "Mei", "Juni", "Juli", "Augustus", "September", "Oktober", "November", "December"],\n datasets: dataSet\n },\n options: {\n legend: {\n display: true\n },\n tooltips: {\n mode: \'index\',\n intersect: true,\n axis: \'y\'\n },\n scales: {\n x: {\n ticks: {\n beginAtZero: true\n },\n stacked: true\n },\n y: {\n ticks: {\n beginAtZero: true,\n stepSize: 1\n },\n stacked: true\n }\n }\n }\n });\n }\n\n componentDidMount() {\n var currentyear = new Date().getFullYear();\n console.log(currentyear);\n fetch(\'/api/books/genres\', {\n "method": "GET",\n "headers": {\n "year": currentyear\n }\n }).then(response => response.json()).then(data => {\n this.initChart(data, currentyear);\n console.log(data);\n });\n }\n\n render() {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("canvas", {\n id: "chart"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", null, "Soon here comes the Reading Analytics System! test"));\n }\n\n}\n\n//# sourceURL=webpack://frontend/./src/App.js?')},"./src/index.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval('__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ "./node_modules/react-dom/index.js");\n/* harmony import */ var _App__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./App */ "./src/App.js");\n\n\n\nreact_dom__WEBPACK_IMPORTED_MODULE_1__.render( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_App__WEBPACK_IMPORTED_MODULE_2__["default"], null), document.getElementById(\'app\'));\n\n//# sourceURL=webpack://frontend/./src/index.js?')},"./node_modules/react-dom/cjs/react-dom.development.js":(__unused_webpack_module,exports,__webpack_require__)=>{eval("/**\n * @license React\n * react-dom.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\nif (true) {\n (function() {\n\n 'use strict';\n\n/* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\nif (\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart ===\n 'function'\n) {\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error());\n}\n var React = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\nvar Scheduler = __webpack_require__(/*! scheduler */ \"./node_modules/scheduler/index.js\");\n\nvar ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n\nvar suppressWarning = false;\nfunction setSuppressWarning(newSuppressWarning) {\n {\n suppressWarning = newSuppressWarning;\n }\n} // In DEV, calls to console.warn and console.error get replaced\n// by calls to these methods by a Babel plugin.\n//\n// In PROD (or in packages without access to React internals),\n// they are left as they are instead.\n\nfunction warn(format) {\n {\n if (!suppressWarning) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n printWarning('warn', format, args);\n }\n }\n}\nfunction error(format) {\n {\n if (!suppressWarning) {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n printWarning('error', format, args);\n }\n }\n}\n\nfunction printWarning(level, format, args) {\n // When changing this logic, you might want to also\n // update consoleWithStackDev.www.js as well.\n {\n var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n var stack = ReactDebugCurrentFrame.getStackAddendum();\n\n if (stack !== '') {\n format += '%s';\n args = args.concat([stack]);\n } // eslint-disable-next-line react-internal/safe-string-coercion\n\n\n var argsWithFormat = args.map(function (item) {\n return String(item);\n }); // Careful: RN currently depends on this prefix\n\n argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it\n // breaks IE9: https://github.com/facebook/react/issues/13610\n // eslint-disable-next-line react-internal/no-production-logging\n\n Function.prototype.apply.call(console[level], console, argsWithFormat);\n }\n}\n\nvar FunctionComponent = 0;\nvar ClassComponent = 1;\nvar IndeterminateComponent = 2; // Before we know whether it is function or class\n\nvar HostRoot = 3; // Root of a host tree. Could be nested inside another node.\n\nvar HostPortal = 4; // A subtree. Could be an entry point to a different renderer.\n\nvar HostComponent = 5;\nvar HostText = 6;\nvar Fragment = 7;\nvar Mode = 8;\nvar ContextConsumer = 9;\nvar ContextProvider = 10;\nvar ForwardRef = 11;\nvar Profiler = 12;\nvar SuspenseComponent = 13;\nvar MemoComponent = 14;\nvar SimpleMemoComponent = 15;\nvar LazyComponent = 16;\nvar IncompleteClassComponent = 17;\nvar DehydratedFragment = 18;\nvar SuspenseListComponent = 19;\nvar ScopeComponent = 21;\nvar OffscreenComponent = 22;\nvar LegacyHiddenComponent = 23;\nvar CacheComponent = 24;\nvar TracingMarkerComponent = 25;\n\n// -----------------------------------------------------------------------------\n\nvar enableClientRenderFallbackOnTextMismatch = true; // TODO: Need to review this code one more time before landing\n// the react-reconciler package.\n\nvar enableNewReconciler = false; // Support legacy Primer support on internal FB www\n\nvar enableLazyContextPropagation = false; // FB-only usage. The new API has different semantics.\n\nvar enableLegacyHidden = false; // Enables unstable_avoidThisFallback feature in Fiber\n\nvar enableSuspenseAvoidThisFallback = false; // Enables unstable_avoidThisFallback feature in Fizz\n// React DOM Chopping Block\n//\n// Similar to main Chopping Block but only flags related to React DOM. These are\n// grouped because we will likely batch all of them into a single major release.\n// -----------------------------------------------------------------------------\n// Disable support for comment nodes as React DOM containers. Already disabled\n// in open source, but www codebase still relies on it. Need to remove.\n\nvar disableCommentsAsDOMContainers = true; // Disable javascript: URL strings in href for XSS protection.\n// and client rendering, mostly to allow JSX attributes to apply to the custom\n// element's object properties instead of only HTML attributes.\n// https://github.com/facebook/react/issues/11347\n\nvar enableCustomElementPropertySupport = false; // Disables children for