From e7ef899bb3df55b19f48208c884f4265f7f07003 Mon Sep 17 00:00:00 2001 From: oslomp Date: Thu, 10 Jan 2019 19:04:37 +0100 Subject: [PATCH 1/9] Improving alert box Fixed error with the cancel button and upgraded the returned messages --- marietje/marietje/static/js/queue.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/marietje/marietje/static/js/queue.js b/marietje/marietje/static/js/queue.js index 1d6e209..e34df2b 100644 --- a/marietje/marietje/static/js/queue.js +++ b/marietje/marietje/static/js/queue.js @@ -49,13 +49,16 @@ $(function () { var songId = $(this).data('report-song-id'); var message = prompt("What is wrong with the song?"); if (message == "") { - alert("Please enter a message."); + createAlert('danger', 'Please enter a message.'); return false } + if (message == null) { + return false + } $.post('/api/report', {id: songId, msg: message, csrfmiddlewaretoken: csrf_token}, function (result) { console.log(result); if (result.success) { - alert("Thanks for the report!"); + createAlert('success', 'Thanks for your song report!'); } }); return false; From 585485b130080c11003fc4cecfb3cb6d018d05ed Mon Sep 17 00:00:00 2001 From: oslomp Date: Fri, 11 Jan 2019 13:11:25 +0100 Subject: [PATCH 2/9] Visually separate regular and Marietje's queue Original commit message: Arrows and marietje part of queue updates --- marietje/api/urls.py | 1 - marietje/api/views.py | 10 ------- marietje/marietje/static/css/custom.css | 8 ++++++ marietje/marietje/static/js/queue.js | 37 ++++++++++++++++++++++--- marietje/queues/models.py | 9 +----- 5 files changed, 42 insertions(+), 23 deletions(-) diff --git a/marietje/api/urls.py b/marietje/api/urls.py index ac0ad39..8fe583d 100644 --- a/marietje/api/urls.py +++ b/marietje/api/urls.py @@ -13,7 +13,6 @@ urlpatterns = [ url(r'^request', views.request), url(r'^report', views.report), url(r'^skip', views.skip), - url(r'^moveup', views.move_up), url(r'^movedown', views.move_down), url(r'^cancel', views.cancel), url(r'^upload', views.upload), diff --git a/marietje/api/views.py b/marietje/api/views.py index 30e9871..7a21351 100644 --- a/marietje/api/views.py +++ b/marietje/api/views.py @@ -188,16 +188,6 @@ def skip(request): return JsonResponse({}) -@require_http_methods(["POST"]) -@api_auth_required -def move_up(request): - if not request.user.has_perm('queues.can_move'): - return HttpResponseForbidden() - playlist_song = get_object_or_404(PlaylistSong, id=request.POST.get('id')) - playlist_song.move_up() - return JsonResponse({}) - - @require_http_methods(["POST"]) @api_auth_required def move_down(request): diff --git a/marietje/marietje/static/css/custom.css b/marietje/marietje/static/css/custom.css index f97451c..c9e8d79 100644 --- a/marietje/marietje/static/css/custom.css +++ b/marietje/marietje/static/css/custom.css @@ -21,3 +21,11 @@ footer { text-align: center; } + +.marietjequeue { + color: #777777; +} + +.marietjequeue-start { + border-top: 4px double #777777; +} \ No newline at end of file diff --git a/marietje/marietje/static/js/queue.js b/marietje/marietje/static/js/queue.js index 1d6e209..431574b 100644 --- a/marietje/marietje/static/js/queue.js +++ b/marietje/marietje/static/js/queue.js @@ -194,27 +194,56 @@ function renderQueue(playNextAt, now) { $('.queuebody').empty(); var timeToPlay = playNextAt - now; + var canDeletePrevious = false; $.each(queue, function (id, song) { var requestedBy = song.requested_by; + var reqMarietje = requestedBy != 'Marietje'; + var startMarietje = false + + //checks if id is the last item and returns false if the next song is Marietje, while the current song is not. + if(id === queue.length-1){ + var requestNext = false + } else { + var requestNext = !((queue[id+1].requested_by === 'Marietje') && (requestedBy !== 'Marietje')) + } + //checks if id is the first item and returns false if the previous song is not Marietje, while the current song is. + if(id === 0){ + var requestPrev = false + } else { + var prevItem = queue[id-1].id + if(queue[id-1].requested_by !== 'Marietje'){ + var requestPrev = false + if (requestedBy == 'Marietje'){ + var startMarietje = true + } else { + var requestPrev = true + } + } else {var requestPrev = true} + } + var canDelete = song.can_move_down || canMoveSongs; - var canMoveDown = canDelete && id < queue.length - 1; + var canMoveUp = canMoveSongs && requestPrev || canDeletePrevious && reqMarietje && requestPrev; + var canMoveDown = canMoveSongs && requestNext || canDelete && reqMarietje && requestNext; var artist = song.song.artist.trim() === '' ? '?' : song.song.artist; var title = song.song.title.trim() === '' ? '?' : song.song.title; + var marietjeclass = reqMarietje ? '' : ' class="marietjequeue"'; + var marietjestartclass = startMarietje ? ' class="marietjequeue marietjequeue-start"' : ''; showTime = showTimeToPlay ? (timeToPlay < 0 ? '' : timeToPlay.secondsToMMSS()) : (playNextAt < now ? '' : playNextAt.timestampToHHMMSS()) - $('.queuebody:last-child').append('' + artist + $('.queuebody:last-child').append('' + '' + artist + '' + title + '' + requestedBy + '' + showTime + '' + '        '); timeToPlay += parseInt(song.song.duration); + canDeletePrevious = canDelete if(playNextAt >= now) { playNextAt += parseInt(song.song.duration); diff --git a/marietje/queues/models.py b/marietje/queues/models.py index 7f765eb..b6fbfef 100644 --- a/marietje/queues/models.py +++ b/marietje/queues/models.py @@ -47,16 +47,9 @@ class PlaylistSong(models.Model): ) state = models.IntegerField(default=0, db_index=True, choices=STATECHOICE) - def move_up(self): - other_song = PlaylistSong.objects.filter(playlist=self.playlist, id__lt=self.id)\ - .order_by('-id').first() - self.switch_order(other_song) def move_down(self): - other_song = PlaylistSong.objects.filter(playlist=self.playlist, id__gt=self.id).order_by('id').first() - self.switch_order(other_song) - - def switch_order(self, other_song): + other_song = PlaylistSong.objects.filter(playlist=self.playlist, id__gt=self.id).first() old_id = self.id self.id = other_song.id other_song.id = old_id From 42a631641e72baa9dcc18d88744a3670b8511046 Mon Sep 17 00:00:00 2001 From: Daan Sprenkels Date: Wed, 16 Jan 2019 19:28:50 +0100 Subject: [PATCH 3/9] Add pylint stub --- .gitlab-ci.yml | 11 + pylintrc | 565 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 576 insertions(+) create mode 100644 .gitlab-ci.yml create mode 100644 pylintrc diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..cb31dad --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,11 @@ +before_script: + - apt-get -qq update + - apt-get -qq install -y python3 python3-venv python3-pip + - python3 -m venv venv + - source venv/bin/activate + - pip install pylint + +pylint: + script: + - pylint marietje metrics playerapi queues songs stats + allow_failure: yes diff --git a/pylintrc b/pylintrc new file mode 100644 index 0000000..8250f8b --- /dev/null +++ b/pylintrc @@ -0,0 +1,565 @@ +[MASTER] + +# A comma-separated list of package or module names from where C extensions may +# be loaded. Extensions are loading into the active Python interpreter and may +# run arbitrary code. +extension-pkg-whitelist= + +# Add files or directories to the blacklist. They should be base names, not +# paths. +ignore=migrations + +# Add files or directories matching the regex patterns to the blacklist. The +# regex matches against base names, not paths. +ignore-patterns= + +# Python code to execute, usually for sys.path manipulation such as +# pygtk.require(). +#init-hook= + +# Use multiple processes to speed up Pylint. Specifying 0 will auto-detect the +# number of processors available to use. +jobs=1 + +# Control the amount of potential inferred values when inferring a single +# object. This can help the performance when dealing with large functions or +# complex, nested conditions. +limit-inference-results=100 + +# List of plugins (as comma separated values of python modules names) to load, +# usually to register additional checkers. +load-plugins= + +# Pickle collected data for later comparisons. +persistent=yes + +# Specify a configuration file. +#rcfile= + +# When enabled, pylint would attempt to guess common misconfiguration and emit +# user-friendly hints instead of false-positive error messages. +suggestion-mode=yes + +# Allow loading of arbitrary C extensions. Extensions are imported into the +# active Python interpreter and may run arbitrary code. +unsafe-load-any-extension=no + + +[MESSAGES CONTROL] + +# Only show warnings with the listed confidence levels. Leave empty to show +# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED. +confidence= + +# Disable the message, report, category or checker with the given id(s). You +# can either give multiple identifiers separated by comma (,) or put this +# option multiple times (only on the command line, not in the configuration +# file where it should appear only once). You can also use "--disable=all" to +# disable everything first and then reenable specific checks. For example, if +# you want to run only the similarities checker, you can use "--disable=all +# --enable=similarities". If you want to run only the classes checker, but have +# no Warning level messages displayed, use "--disable=all --enable=classes +# --disable=W". +disable=missing-docstring, + line-too-long, + no-member, + parameter-unpacking, + unpacking-in-except, + backtick, + long-suffix, + old-ne-operator, + old-octal-literal, + import-star-module-level, + non-ascii-bytes-literal, + raw-checker-failed, + bad-inline-option, + locally-disabled, + file-ignored, + suppressed-message, + useless-suppression, + deprecated-pragma, + use-symbolic-message-instead, + apply-builtin, + basestring-builtin, + buffer-builtin, + cmp-builtin, + coerce-builtin, + execfile-builtin, + file-builtin, + long-builtin, + raw_input-builtin, + reduce-builtin, + standarderror-builtin, + unicode-builtin, + xrange-builtin, + coerce-method, + delslice-method, + getslice-method, + setslice-method, + no-absolute-import, + old-division, + dict-iter-method, + dict-view-method, + next-method-called, + metaclass-assignment, + indexing-exception, + raising-string, + reload-builtin, + oct-method, + hex-method, + nonzero-method, + cmp-method, + input-builtin, + round-builtin, + intern-builtin, + unichr-builtin, + map-builtin-not-iterating, + zip-builtin-not-iterating, + range-builtin-not-iterating, + filter-builtin-not-iterating, + using-cmp-argument, + eq-without-hash, + div-method, + idiv-method, + rdiv-method, + exception-message-attribute, + invalid-str-codec, + sys-max-int, + bad-python3-import, + deprecated-string-function, + deprecated-str-translate-call, + deprecated-itertools-function, + deprecated-types-field, + next-method-defined, + dict-items-not-iterating, + dict-keys-not-iterating, + dict-values-not-iterating, + deprecated-operator-function, + deprecated-urllib-function, + xreadlines-attribute, + deprecated-sys-function, + exception-escape, + comprehension-escape + +# Enable the message, report, category or checker with the given id(s). You can +# either give multiple identifier separated by comma (,) or put this option +# multiple time (only on the command line, not in the configuration file where +# it should appear only once). See also the "--disable" option for examples. +enable=c-extension-no-member + + +[REPORTS] + +# Python expression which should return a note less than 10 (10 is the highest +# note). You have access to the variables errors warning, statement which +# respectively contain the number of errors / warnings messages and the total +# number of statements analyzed. This is used by the global evaluation report +# (RP0004). +evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) + +# Template used to display messages. This is a python new-style format string +# used to format the message information. See doc for all details. +#msg-template= + +# Set the output format. Available formats are text, parseable, colorized, json +# and msvs (visual studio). You can also give a reporter class, e.g. +# mypackage.mymodule.MyReporterClass. +output-format=text + +# Tells whether to display a full report or only the messages. +reports=no + +# Activate the evaluation score. +score=yes + + +[REFACTORING] + +# Maximum number of nested blocks for function / method body +max-nested-blocks=5 + +# Complete name of functions that never returns. When checking for +# inconsistent-return-statements if a never returning function is called then +# it will be considered as an explicit return statement and no message will be +# printed. +never-returning-functions=sys.exit + + +[VARIABLES] + +# List of additional names supposed to be defined in builtins. Remember that +# you should avoid defining new builtins when possible. +additional-builtins= + +# Tells whether unused global variables should be treated as a violation. +allow-global-unused-variables=yes + +# List of strings which can identify a callback function by name. A callback +# name must start or end with one of those strings. +callbacks=cb_, + _cb + +# A regular expression matching the name of dummy variables (i.e. expected to +# not be used). +dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_ + +# Argument names that match this expression will be ignored. Default to name +# with leading underscore. +ignored-argument-names=_.*|^ignored_|^unused_ + +# Tells whether we should check for unused import in __init__ files. +init-import=no + +# List of qualified module names which can have objects that can redefine +# builtins. +redefining-builtins-modules=six.moves,past.builtins,future.builtins,builtins,io + + +[TYPECHECK] + +# List of decorators that produce context managers, such as +# contextlib.contextmanager. Add to this list to register other decorators that +# produce valid context managers. +contextmanager-decorators=contextlib.contextmanager + +# List of members which are set dynamically and missed by pylint inference +# system, and so shouldn't trigger E1101 when accessed. Python regular +# expressions are accepted. +generated-members= + +# Tells whether missing members accessed in mixin class should be ignored. A +# mixin class is detected if its name ends with "mixin" (case insensitive). +ignore-mixin-members=yes + +# Tells whether to warn about missing members when the owner of the attribute +# is inferred to be None. +ignore-none=yes + +# This flag controls whether pylint should warn about no-member and similar +# checks whenever an opaque object is returned when inferring. The inference +# can return multiple potential results while evaluating a Python object, but +# some branches might not be evaluated, which results in partial inference. In +# that case, it might be useful to still emit no-member and other checks for +# the rest of the inferred objects. +ignore-on-opaque-inference=yes + +# List of class names for which member attributes should not be checked (useful +# for classes with dynamically set attributes). This supports the use of +# qualified names. +ignored-classes=optparse.Values,thread._local,_thread._local + +# List of module names for which member attributes should not be checked +# (useful for modules/projects where namespaces are manipulated during runtime +# and thus existing member attributes cannot be deduced by static analysis. It +# supports qualified module names, as well as Unix pattern matching. +ignored-modules= + +# Show a hint with possible names when a member name was not found. The aspect +# of finding the hint is based on edit distance. +missing-member-hint=yes + +# The minimum edit distance a name should have in order to be considered a +# similar match for a missing member name. +missing-member-hint-distance=1 + +# The total number of similar names that should be taken in consideration when +# showing a hint for a missing member. +missing-member-max-choices=1 + + +[SPELLING] + +# Limits count of emitted suggestions for spelling mistakes. +max-spelling-suggestions=4 + +# Spelling dictionary name. Available dictionaries: none. To make it working +# install python-enchant package.. +spelling-dict= + +# List of comma separated words that should not be checked. +spelling-ignore-words= + +# A path to a file that contains private dictionary; one word per line. +spelling-private-dict-file= + +# Tells whether to store unknown words to indicated private dictionary in +# --spelling-private-dict-file option instead of raising a message. +spelling-store-unknown-words=no + + +[SIMILARITIES] + +# Ignore comments when computing similarities. +ignore-comments=yes + +# Ignore docstrings when computing similarities. +ignore-docstrings=yes + +# Ignore imports when computing similarities. +ignore-imports=no + +# Minimum lines number of a similarity. +min-similarity-lines=4 + + +[MISCELLANEOUS] + +# List of note tags to take in consideration, separated by a comma. +notes=FIXME, + XXX, + TODO + + +[LOGGING] + +# Format style used to check logging format string. `old` means using % +# formatting, while `new` is for `{}` formatting. +logging-format-style=old + +# Logging modules to check that the string format arguments are in logging +# function parameter format. +logging-modules=logging + + +[FORMAT] + +# Expected format of line ending, e.g. empty (any line ending), LF or CRLF. +expected-line-ending-format= + +# Regexp for a line that is allowed to be longer than the limit. +ignore-long-lines=^\s*(# )??$ + +# Number of spaces of indent required inside a hanging or continued line. +indent-after-paren=4 + +# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 +# tab). +indent-string=' ' + +# Maximum number of characters on a single line. +max-line-length=100 + +# Maximum number of lines in a module. +max-module-lines=1000 + +# List of optional constructs for which whitespace checking is disabled. `dict- +# separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}. +# `trailing-comma` allows a space between comma and closing bracket: (a, ). +# `empty-line` allows space-only lines. +no-space-check=trailing-comma, + dict-separator + +# Allow the body of a class to be on the same line as the declaration if body +# contains single statement. +single-line-class-stmt=no + +# Allow the body of an if to be on the same line as the test if there is no +# else. +single-line-if-stmt=no + + +[BASIC] + +# Naming style matching correct argument names. +argument-naming-style=snake_case + +# Regular expression matching correct argument names. Overrides argument- +# naming-style. +#argument-rgx= + +# Naming style matching correct attribute names. +attr-naming-style=snake_case + +# Regular expression matching correct attribute names. Overrides attr-naming- +# style. +#attr-rgx= + +# Bad variable names which should always be refused, separated by a comma. +bad-names=foo, + bar, + baz, + toto, + tutu, + tata, + blah, + bla + +# Naming style matching correct class attribute names. +class-attribute-naming-style=any + +# Regular expression matching correct class attribute names. Overrides class- +# attribute-naming-style. +#class-attribute-rgx= + +# Naming style matching correct class names. +class-naming-style=PascalCase + +# Regular expression matching correct class names. Overrides class-naming- +# style. +#class-rgx= + +# Naming style matching correct constant names. +const-naming-style=UPPER_CASE + +# Regular expression matching correct constant names. Overrides const-naming- +# style. +#const-rgx= + +# Minimum line length for functions/classes that require docstrings, shorter +# ones are exempt. +docstring-min-length=50 + +# Naming style matching correct function names. +function-naming-style=snake_case + +# Regular expression matching correct function names. Overrides function- +# naming-style. +#function-rgx= + +# Good variable names which should always be accepted, separated by a comma. +good-names=i, + j, + k, + ex, + Run, + x, y, z, + _ + +# Include a hint for the correct naming format with invalid-name. +include-naming-hint=no + +# Naming style matching correct inline iteration names. +inlinevar-naming-style=any + +# Regular expression matching correct inline iteration names. Overrides +# inlinevar-naming-style. +#inlinevar-rgx= + +# Naming style matching correct method names. +method-naming-style=snake_case + +# Regular expression matching correct method names. Overrides method-naming- +# style. +#method-rgx= + +# Naming style matching correct module names. +module-naming-style=snake_case + +# Regular expression matching correct module names. Overrides module-naming- +# style. +#module-rgx= + +# Colon-delimited sets of names that determine each other's naming style when +# the name regexes allow several styles. +name-group= + +# Regular expression which should only match function or class names that do +# not require a docstring. +no-docstring-rgx=^_ + +# List of decorators that produce properties, such as abc.abstractproperty. Add +# to this list to register other decorators that produce valid properties. +# These decorators are taken in consideration only for invalid-name. +property-classes=abc.abstractproperty + +# Naming style matching correct variable names. +variable-naming-style=snake_case + +# Regular expression matching correct variable names. Overrides variable- +# naming-style. +#variable-rgx= + + +[IMPORTS] + +# Allow wildcard imports from modules that define __all__. +allow-wildcard-with-all=no + +# Analyse import fallback blocks. This can be used to support both Python 2 and +# 3 compatible code, which means that the block might have code that exists +# only in one or another interpreter, leading to false positives when analysed. +analyse-fallback-blocks=no + +# Deprecated modules which should not be used, separated by a comma. +deprecated-modules=optparse,tkinter.tix + +# Create a graph of external dependencies in the given file (report RP0402 must +# not be disabled). +ext-import-graph= + +# Create a graph of every (i.e. internal and external) dependencies in the +# given file (report RP0402 must not be disabled). +import-graph= + +# Create a graph of internal dependencies in the given file (report RP0402 must +# not be disabled). +int-import-graph= + +# Force import order to recognize a module as part of the standard +# compatibility libraries. +known-standard-library= + +# Force import order to recognize a module as part of a third party library. +known-third-party=enchant + + +[DESIGN] + +# Maximum number of arguments for function / method. +max-args=5 + +# Maximum number of attributes for a class (see R0902). +max-attributes=7 + +# Maximum number of boolean expressions in an if statement. +max-bool-expr=5 + +# Maximum number of branch for function / method body. +max-branches=12 + +# Maximum number of locals for function / method body. +max-locals=15 + +# Maximum number of parents for a class (see R0901). +max-parents=7 + +# Maximum number of public methods for a class (see R0904). +max-public-methods=20 + +# Maximum number of return / yield for function / method body. +max-returns=6 + +# Maximum number of statements in function / method body. +max-statements=50 + +# Minimum number of public methods for a class (see R0903). +min-public-methods=2 + + +[CLASSES] + +# List of method names used to declare (i.e. assign) instance attributes. +defining-attr-methods=__init__, + __new__, + setUp + +# List of member names, which should be excluded from the protected access +# warning. +exclude-protected=_asdict, + _fields, + _replace, + _source, + _make + +# List of valid names for the first argument in a class method. +valid-classmethod-first-arg=cls + +# List of valid names for the first argument in a metaclass class method. +valid-metaclass-classmethod-first-arg=cls + + +[EXCEPTIONS] + +# Exceptions that will emit a warning when being caught. Defaults to +# "Exception". +overgeneral-exceptions=Exception From f10a4759da6b1f147448c310cf1f9f69e4318eee Mon Sep 17 00:00:00 2001 From: Daan Sprenkels Date: Sun, 20 Jan 2019 22:27:03 +0100 Subject: [PATCH 4/9] Move issues/MRs urls to dsprenkels Fixes #1 --- marietje/marietje/settings.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/marietje/marietje/settings.py b/marietje/marietje/settings.py index fa3a15f..07c5038 100644 --- a/marietje/marietje/settings.py +++ b/marietje/marietje/settings.py @@ -139,8 +139,8 @@ CONTACT_EMAIL = 'marietje@science.ru.nl' STATS_TOP_COUNT = 50 STATS_REQUEST_IGNORE_USER_IDS = [] -ISSUES_URL = 'https://gitlab.science.ru.nl/Marietje/MarietjeDjango/issues' -MERGE_REQUESTS_URL = 'https://gitlab.science.ru.nl/Marietje/MarietjeDjango/merge_requests' +ISSUES_URL = 'https://gitlab.science.ru.nl/dsprenkels/MarietjeDjango/issues' +MERGE_REQUESTS_URL = 'https://gitlab.science.ru.nl/dsprenkels/MarietjeDjango/merge_requests' TRUSTED_IP_RANGES = [ '131.174.0.0/16', # RU wired '145.116.136.0/22', # eduroam From 14bfa8a9a015d197470604d9b5f7f94c5d20d5ac Mon Sep 17 00:00:00 2001 From: Daan Sprenkels Date: Sun, 20 Jan 2019 22:31:34 +0100 Subject: [PATCH 5/9] ci: Install django --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index cb31dad..4862474 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,7 +3,7 @@ before_script: - apt-get -qq install -y python3 python3-venv python3-pip - python3 -m venv venv - source venv/bin/activate - - pip install pylint + - pip install -r requirements.txt pylint pylint: script: From 2c41e85753818f20f77a89e82320bf8e5330853e Mon Sep 17 00:00:00 2001 From: Daan Sprenkels Date: Sun, 20 Jan 2019 22:36:19 +0100 Subject: [PATCH 6/9] ci: Make pylint modules more explicit --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4862474..fab58b5 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -7,5 +7,5 @@ before_script: pylint: script: - - pylint marietje metrics playerapi queues songs stats + - pylint marietje/marietje marietje/metrics marietje/playerapi marietje/queues marietje/songs marietje/stats allow_failure: yes From 19c1c70cd300b1bb4e77508846a4c049c8a04917 Mon Sep 17 00:00:00 2001 From: Daan Sprenkels Date: Mon, 21 Jan 2019 22:26:43 +0100 Subject: [PATCH 7/9] fix all pylint complaints --- .gitlab-ci.yml | 1 - marietje/api/views.py | 4 ++-- marietje/marietje/forms.py | 3 --- marietje/marietje/models.py | 6 +++--- marietje/marietje/settings.py | 6 +++--- marietje/marietje/utils.py | 29 ++++++++++++++++------------- marietje/marietje/views.py | 3 +-- marietje/metrics/admin.py | 3 --- marietje/metrics/models.py | 3 --- marietje/metrics/tests.py | 3 --- marietje/metrics/views.py | 10 ++++------ marietje/playerapi/admin.py | 3 --- marietje/playerapi/models.py | 3 --- marietje/playerapi/tests.py | 3 --- marietje/playerapi/views.py | 19 ++++++++++--------- marietje/queues/models.py | 9 ++++----- marietje/queues/tests.py | 3 --- marietje/queues/urls.py | 8 +------- marietje/songs/admin.py | 3 ++- marietje/songs/models.py | 7 +++++-- marietje/songs/tests.py | 3 --- marietje/songs/views.py | 6 +++--- marietje/stats/admin.py | 3 --- marietje/stats/models.py | 3 --- marietje/stats/tests.py | 3 --- marietje/stats/utils.py | 22 ++++++++++------------ marietje/stats/views.py | 23 ++++++++++------------- pylintrc | 12 +++++++++++- 28 files changed, 85 insertions(+), 119 deletions(-) delete mode 100644 marietje/metrics/admin.py delete mode 100644 marietje/metrics/models.py delete mode 100644 marietje/metrics/tests.py delete mode 100644 marietje/playerapi/admin.py delete mode 100644 marietje/playerapi/models.py delete mode 100644 marietje/playerapi/tests.py delete mode 100644 marietje/queues/tests.py delete mode 100644 marietje/songs/tests.py delete mode 100644 marietje/stats/admin.py delete mode 100644 marietje/stats/models.py delete mode 100644 marietje/stats/tests.py diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index fab58b5..25975d3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -8,4 +8,3 @@ before_script: pylint: script: - pylint marietje/marietje marietje/metrics marietje/playerapi marietje/queues marietje/songs marietje/stats - allow_failure: yes diff --git a/marietje/api/views.py b/marietje/api/views.py index 7a21351..ec0d2f0 100644 --- a/marietje/api/views.py +++ b/marietje/api/views.py @@ -111,7 +111,7 @@ def songs(request): except EmptyPage: songs = paginator.page(paginator.num_pages) - songs_dict = [song_to_dict(song, user=True) for song in songs.object_list] + songs_dict = [song_to_dict(song, include_user=True) for song in songs.object_list] return JsonResponse({ 'per_page': pagesize, 'current_page': page, @@ -170,7 +170,7 @@ def queue(request): queue = request.user.queue return JsonResponse({ 'current_song': playlist_song_to_dict(queue.current_song()), - 'queue': [playlist_song_to_dict(playlist_song, user=request.user) for playlist_song in queue.queue()], + 'queue': [playlist_song_to_dict(playlist_song, include_user=request.user) for playlist_song in queue.queue()], 'started_at': 0 if queue.started_at is None else int(queue.started_at.timestamp()), 'current_time': int(time.time()) }) diff --git a/marietje/marietje/forms.py b/marietje/marietje/forms.py index c04b1c1..41e741a 100644 --- a/marietje/marietje/forms.py +++ b/marietje/marietje/forms.py @@ -5,9 +5,6 @@ from django.utils.translation import ugettext_lazy as _ class AuthenticationForm(BaseAuthenticationForm): - def __init__(self, request=None, *args, **kwargs): - super(AuthenticationForm, self).__init__(request, *args, **kwargs) - def confirm_login_allowed(self, user): if user.activation_token: raise forms.ValidationError( diff --git a/marietje/marietje/models.py b/marietje/marietje/models.py index b89c502..6421c5d 100644 --- a/marietje/marietje/models.py +++ b/marietje/marietje/models.py @@ -1,14 +1,14 @@ -from django.db import models -from queues.models import Queue from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager from django.contrib.auth.hashers import make_password from django.contrib.auth.models import PermissionsMixin from django.contrib.auth.validators import ASCIIUsernameValidator, UnicodeUsernameValidator +from django.core.mail import send_mail +from django.db import models from django.utils import six, timezone from django.utils.translation import ugettext_lazy as _ -from django.core.mail import send_mail from marietje.utils import get_first_queue +from queues.models import Queue class UserManager(BaseUserManager): diff --git a/marietje/marietje/settings.py b/marietje/marietje/settings.py index 07c5038..0f4fb17 100644 --- a/marietje/marietje/settings.py +++ b/marietje/marietje/settings.py @@ -62,7 +62,7 @@ DATABASES = { 'PASSWORD': 'v8TzZwdAdSi7Tk5I', 'HOST': 'localhost', 'PORT': '3306', - 'OPTIONS': { 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'" }, + 'OPTIONS': {'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"}, } } @@ -95,12 +95,12 @@ CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION': '/var/tmp/MarietjeDjango_cache/default', - 'OPTIONS': { 'MAX_ENTRIES': 1000 }, + 'OPTIONS': {'MAX_ENTRIES': 1000}, }, 'song_search': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION': '/var/tmp/MarietjeDjango_cache/song_search', - 'OPTIONS': { 'MAX_ENTRIES': 1000 }, + 'OPTIONS': {'MAX_ENTRIES': 1000}, }, } diff --git a/marietje/marietje/utils.py b/marietje/marietje/utils.py index 8c6f03b..b7fea32 100644 --- a/marietje/marietje/utils.py +++ b/marietje/marietje/utils.py @@ -1,10 +1,13 @@ -import socket, struct, binascii +import binascii +import socket +import struct + from django.conf import settings -from queues.models import Queue, Playlist from django.http import StreamingHttpResponse +from queues.models import Queue, Playlist -def song_to_dict(song, hash=False, user=False, replaygain=False): +def song_to_dict(song, include_hash=False, include_user=False, include_replaygain=False): data = { 'id': song.id, 'artist': song.artist, @@ -12,13 +15,13 @@ def song_to_dict(song, hash=False, user=False, replaygain=False): 'duration': song.duration, } - if hash: + if include_hash: data['hash'] = song.hash - if user is not None and song.user is not None and song.user.name: + if include_user is not None and song.user is not None and song.user.name: data['uploader_name'] = song.user.name - if replaygain: + if include_replaygain: data['rg_gain'] = song.rg_gain data['rg_peak'] = song.rg_peak @@ -44,9 +47,9 @@ def send_to_bertha(file): for chunk in file.chunks(): sock.sendall(chunk) sock.shutdown(socket.SHUT_WR) - hash = binascii.hexlify(sock.recv(64)) + song_hash = binascii.hexlify(sock.recv(64)) sock.close() - return hash + return song_hash def get_first_queue(): @@ -61,10 +64,10 @@ def get_first_queue(): return queue -def bertha_stream(hash): +def bertha_stream(song_hash): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(settings.BERTHA_HOST) - sock.sendall(struct.pack(" Date: Wed, 30 Jan 2019 13:37:59 +0100 Subject: [PATCH 8/9] Fix bug introduced by 19c1c70 --- marietje/api/views.py | 2 +- marietje/marietje/utils.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/marietje/api/views.py b/marietje/api/views.py index ec0d2f0..5dc453e 100644 --- a/marietje/api/views.py +++ b/marietje/api/views.py @@ -170,7 +170,7 @@ def queue(request): queue = request.user.queue return JsonResponse({ 'current_song': playlist_song_to_dict(queue.current_song()), - 'queue': [playlist_song_to_dict(playlist_song, include_user=request.user) for playlist_song in queue.queue()], + 'queue': [playlist_song_to_dict(playlist_song, user=request.user) for playlist_song in queue.queue()], 'started_at': 0 if queue.started_at is None else int(queue.started_at.timestamp()), 'current_time': int(time.time()) }) diff --git a/marietje/marietje/utils.py b/marietje/marietje/utils.py index b7fea32..ae32c35 100644 --- a/marietje/marietje/utils.py +++ b/marietje/marietje/utils.py @@ -7,7 +7,7 @@ from django.http import StreamingHttpResponse from queues.models import Queue, Playlist -def song_to_dict(song, include_hash=False, include_user=False, include_replaygain=False): +def song_to_dict(song, include_hash=False, include_user=False, include_replaygain=False, **options): data = { 'id': song.id, 'artist': song.artist, From 4ac3d6e42575caff6a237078df5967e671b05b35 Mon Sep 17 00:00:00 2001 From: Daan Sprenkels Date: Wed, 30 Jan 2019 13:19:46 +0100 Subject: [PATCH 9/9] reports: Make songs readonly for performance --- marietje/songs/admin.py | 1 + 1 file changed, 1 insertion(+) diff --git a/marietje/songs/admin.py b/marietje/songs/admin.py index 9ff8927..79f456a 100644 --- a/marietje/songs/admin.py +++ b/marietje/songs/admin.py @@ -32,3 +32,4 @@ class SongAdmin(admin.ModelAdmin): class ReportNoteAdmin(admin.ModelAdmin): list_display = ('song', 'note', 'user') search_fields = ('song__artist', 'song__title', 'user__name') + readonly_fields = ('song',)