From 10b5995856537653ca36cf1b7d9f39f4682eba3e Mon Sep 17 00:00:00 2001 From: jolheiser Date: Thu, 10 Feb 2022 20:16:04 -0600 Subject: [PATCH 1/4] Fix coords Signed-off-by: jolheiser --- gui.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gui.py b/gui.py index 1ed19d6..a49f8a2 100644 --- a/gui.py +++ b/gui.py @@ -101,12 +101,12 @@ def gui_results(form): coords = [] radius = form.radius if form.radius else "0" if form.x: - coords.append(" AND x BETWEEN {0} - {1} AND {0} + {1}".format(form.x, radius)) + coords.append(" x BETWEEN {0} - {1} AND {0} + {1}".format(form.x, radius)) if form.y: - coords.append(" AND y BETWEEN {0} - {1} AND {0} + {1}".format(form.y, radius)) + coords.append(" y BETWEEN {0} - {1} AND {0} + {1}".format(form.y, radius)) if form.z: - coords.append(" AND z BETWEEN {0} - {1} AND {0} + {1}".format(form.z, radius)) - coords_clause = " AND ".join(coords) + coords.append(" z BETWEEN {0} - {1} AND {0} + {1}".format(form.z, radius)) + coords_clause = " AND ({})".format(" AND ".join(coords)) players = [] players_clause = "" -- 2.41.0 From 7dfc0dd1a85b9b1937726136a2eef5f0c7aa4ec0 Mon Sep 17 00:00:00 2001 From: Etzelia Date: Mon, 30 Sep 2019 17:02:21 -0500 Subject: [PATCH 2/4] Start work on presets Signed-off-by: Etzelia --- admin.py | 3 +- migrations/0002_preset.py | 40 +++++++++++++++ models.py | 70 ++++++++++++++++++++++++++ templates/coreprotect/coreprotect.html | 4 ++ views.py | 3 +- 5 files changed, 118 insertions(+), 2 deletions(-) create mode 100644 migrations/0002_preset.py diff --git a/admin.py b/admin.py index 1c6e392..6cdea8d 100644 --- a/admin.py +++ b/admin.py @@ -1,7 +1,7 @@ from django.contrib import admin from django_coreprotect.models import CoArtMap, CoBlock, CoBlockdataMap, CoChat, CoCommand, CoContainer, CoDatabaseLock, \ - CoEntity, CoEntityMap, CoMaterialMap, CoSession, CoSign, CoSkull, CoUser, CoUsernameLog, CoVersion, CoWorld + CoEntity, CoEntityMap, CoMaterialMap, CoSession, CoSign, CoSkull, CoUser, CoUsernameLog, CoVersion, CoWorld, Preset try: pass @@ -22,5 +22,6 @@ try: # admin.site.register(CoUsernameLog) # admin.site.register(CoVersion) # admin.site.register(CoWorld) + admin.site.register(Preset) except admin.sites.AlreadyRegistered: pass diff --git a/migrations/0002_preset.py b/migrations/0002_preset.py new file mode 100644 index 0000000..8dd2cdc --- /dev/null +++ b/migrations/0002_preset.py @@ -0,0 +1,40 @@ +# Generated by Django 2.2.3 on 2019-09-30 21:59 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('django_coreprotect', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Preset', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=50)), + ('block_break', models.BooleanField(default=False)), + ('block_place', models.BooleanField(default=False)), + ('chat', models.BooleanField(default=False)), + ('chest_use', models.BooleanField(default=False)), + ('command', models.BooleanField(default=False)), + ('interact', models.BooleanField(default=False)), + ('login_logout', models.BooleanField(default=False)), + ('sign_place', models.BooleanField(default=False)), + ('worlds', models.CharField(default='', max_length=20)), + ('ignore_environment', models.BooleanField(default=False)), + ('oldest_first', models.BooleanField(default=False)), + ('players', models.CharField(max_length=50)), + ('x', models.CharField(default='', max_length=10)), + ('y', models.CharField(default='', max_length=10)), + ('z', models.CharField(default='', max_length=10)), + ('radius', models.CharField(default='', max_length=10)), + ('blocks', models.CharField(default='', max_length=50)), + ('date_from', models.CharField(default='', max_length=10)), + ('date_to', models.CharField(default='', max_length=10)), + ('enabled', models.BooleanField(default=True)), + ], + ), + ] diff --git a/models.py b/models.py index 4a1885f..0702fdf 100644 --- a/models.py +++ b/models.py @@ -1,4 +1,6 @@ from django.db import models +from django.db.models import Q +from django.shortcuts import reverse from django.contrib.auth.models import User from datetime import datetime from django_coreprotect.utils import safe_int @@ -291,6 +293,74 @@ class CoWorld(models.Model): return self.world +class Preset(models.Model): + name = models.CharField(max_length=50) + block_break = models.BooleanField(default=False) + block_place = models.BooleanField(default=False) + chat = models.BooleanField(default=False) + chest_use = models.BooleanField(default=False) + command = models.BooleanField(default=False) + interact = models.BooleanField(default=False) + login_logout = models.BooleanField(default=False) + sign_place = models.BooleanField(default=False) + worlds = models.CharField(max_length=20, default="", blank=True) + ignore_environment = models.BooleanField(default=False) + oldest_first = models.BooleanField(default=False) + players = models.CharField(max_length=50, blank=True) + x = models.CharField(max_length=10, default="", blank=True) + y = models.CharField(max_length=10, default="", blank=True) + z = models.CharField(max_length=10, default="", blank=True) + radius = models.CharField(max_length=10, default="", blank=True) + blocks = models.CharField(max_length=50, default="", blank=True) + date_from = models.CharField(max_length=10, default="", blank=True) + date_to = models.CharField(max_length=10, default="", blank=True) + enabled = models.BooleanField(default=True) + + @property + def link(self): + url = reverse("coreprotect_gui") + "?" + params = [] + if self.block_break: + params.append("block_break=on") + if self.block_place: + params.append("block_place=on") + if self.chat: + params.append("chat=on") + if self.chest_use: + params.append("chest_use=on") + if self.command: + params.append("command=on") + if self.interact: + params.append("interact=on") + if self.login_logout: + params.append("login_logout=on") + if self.sign_place: + params.append("sign_place=on") + if self.worlds: + params.append("world=" + self.worlds) + if self.ignore_environment: + params.append("ignore_environment=on") + if self.oldest_first: + params.append("oldest_first=on") + if self.players: + params.append("players=" + self.players) + if self.x: + params.append("x=" + self.x) + if self.y: + params.append("y=" + self.y) + if self.z: + params.append("z=" + self.z) + if self.radius: + params.append("radius=" + self.radius) + if self.blocks: + params.append("blocks=" + self.blocks) + if self.date_from: + params.append("date_from=" + self.date_from) + if self.date_to: + params.append("date_to=" + self.date_to) + return url + "&".join(params) + + class GUIResult(models.Model): type = models.TextField() unix = models.TextField() diff --git a/templates/coreprotect/coreprotect.html b/templates/coreprotect/coreprotect.html index b8b8dd6..3d1326d 100644 --- a/templates/coreprotect/coreprotect.html +++ b/templates/coreprotect/coreprotect.html @@ -95,6 +95,10 @@

+ + {% for preset in presets %} + {{ preset.name }} + {% endfor %} diff --git a/views.py b/views.py index f92f30e..3a80f30 100644 --- a/views.py +++ b/views.py @@ -4,13 +4,14 @@ from django.http.response import JsonResponse from django_coreprotect.gui import gui_data, gui_results from django_coreprotect.activity import activity_data, activity_results from django_coreprotect.utils import safe_int +from django_coreprotect.models import Preset class GUI(View): def get(self, request): form = gui_data(request) - return render(request, "coreprotect/coreprotect.html", {"form": form}) + return render(request, "coreprotect/coreprotect.html", {"form": form, "presets": Preset.objects.filter(enabled=True)}) def post(self, request): pass -- 2.41.0 From dac77b4c08533624603b27be3689bd132af74ad4 Mon Sep 17 00:00:00 2001 From: Etzelia Date: Tue, 1 Oct 2019 00:25:43 -0500 Subject: [PATCH 3/4] Completed presets Signed-off-by: Etzelia --- admin.py | 47 +++++++++++++++++++- gui.py | 22 +++++++--- migrations/0002_preset.py | 20 ++++----- models.py | 10 +++-- templates/coreprotect/coreprotect.html | 60 ++++++++++++++++++-------- utils.py | 28 +++++++++++- 6 files changed, 148 insertions(+), 39 deletions(-) diff --git a/admin.py b/admin.py index 6cdea8d..dd42891 100644 --- a/admin.py +++ b/admin.py @@ -1,8 +1,53 @@ from django.contrib import admin +from django.contrib.admin import widgets as admin_widgets +from django import forms +import ast +from django_coreprotect.utils import time_to_form, form_to_time from django_coreprotect.models import CoArtMap, CoBlock, CoBlockdataMap, CoChat, CoCommand, CoContainer, CoDatabaseLock, \ CoEntity, CoEntityMap, CoMaterialMap, CoSession, CoSign, CoSkull, CoUser, CoUsernameLog, CoVersion, CoWorld, Preset + +class PresetAdminForm(forms.ModelForm): + def __init__(self, *args, **kwargs): + super(PresetAdminForm, self).__init__(*args, **kwargs) + + worlds = tuple([(world.id, world.world) for world in CoWorld.objects.all()]) + self.fields['worlds'].widget = forms.SelectMultiple(choices=worlds) + self.fields['date_from'].widget = admin_widgets.AdminSplitDateTime() + self.fields['date_to'].widget = admin_widgets.AdminSplitDateTime() + + if self.instance: + if "worlds" in self.initial and self.initial["worlds"]: + self.initial["worlds"] = tuple(self.initial["worlds"]) + if "date_from" in self.initial and self.initial["date_from"]: + self.initial["date_from"] = time_to_form(self.initial["date_from"]) + if "date_to" in self.initial and self.initial["date_to"]: + self.initial["date_to"] = time_to_form(self.initial["date_to"]) + + def clean(self): + cleaned = super(PresetAdminForm, self).clean() + worlds = cleaned.get("worlds", "") + if worlds: + worlds = ast.literal_eval(worlds) + cleaned.update({"worlds": ",".join(worlds)}) + date_from = cleaned.get("date_from", "") + if date_from: + cleaned.update({"date_from": form_to_time(date_from)}) + date_to = cleaned.get("date_to", "") + if date_to: + cleaned.update({"date_to": form_to_time(date_to)}) + return cleaned + + class Meta: + model = Preset + fields = "__all__" + + +class PresetAdmin(admin.ModelAdmin): + form = PresetAdminForm + + try: pass # admin.site.register(CoArtMap) @@ -22,6 +67,6 @@ try: # admin.site.register(CoUsernameLog) # admin.site.register(CoVersion) # admin.site.register(CoWorld) - admin.site.register(Preset) + admin.site.register(Preset, PresetAdmin) except admin.sites.AlreadyRegistered: pass diff --git a/gui.py b/gui.py index a49f8a2..767cebd 100644 --- a/gui.py +++ b/gui.py @@ -1,5 +1,5 @@ from django_coreprotect.models import CoWorld, GUIResult -from django_coreprotect.utils import safe_int, checkbox +from django_coreprotect.utils import safe_int, checkbox, time_to_form from datetime import datetime from django.db import connection @@ -87,8 +87,12 @@ def gui_data(request): form.blocks = request_data["blocks"] if "blocks" in request_data else "" # Date and Time - form.date_from = request_data["date_from"] if "date_from" in request_data else "" - form.date_to = request_data["date_to"] if "date_to" in request_data else "" + form.date_from = time_to_form(request_data["date_from"]) if "date_from" in request_data else "" + if form.date_from: + form.date_from = form.date_from.timestamp() + form.date_to = time_to_form(request_data["date_to"]) if "date_to" in request_data else "" + if form.date_to: + form.date_to = form.date_to.timestamp() return form @@ -117,10 +121,14 @@ def gui_results(form): blocks = [] blocks_clause = "" + chat_clause = "" + command_clause = "" if form.blocks: for block in form.blocks.split(","): blocks.append(block.strip()) blocks_clause = " AND ({})".format(" OR ".join(["cmm.material LIKE 'minecraft:{}%%'".format(b) for b in blocks])) + chat_clause = " AND ({})".format(" OR ".join(["cc.message LIKE '%%{}%%'".format(b) for b in blocks])) + command_clause = " AND ({})".format(" OR ".join(["cc.message LIKE '%%{}%%'".format(b) for b in blocks])) worlds_clause = "" worlds = [world["id"] for world in form.worlds if world["checked"]] @@ -134,7 +142,7 @@ def gui_results(form): dt = datetime.now().timestamp() if form.date_to and not form.date_from: df = datetime.now().timestamp() - time_clause = " HAVING unix BETWEEN {} AND {} ".format(df, dt) + time_clause = " GROUP BY unix HAVING unix BETWEEN {} AND {} ".format(df, dt) # Block Break, Block Place, and Interact block_actions = [] @@ -169,8 +177,9 @@ def gui_results(form): JOIN co_user cu ON cc.user = cu.rowid WHERE 1 = 1 {players} + {chat} {time} - '''.format(players=players_clause, time=time_clause)) + '''.format(players=players_clause, chat=chat_clause, time=time_clause)) # Chest Use if form.chest_use: @@ -199,9 +208,10 @@ def gui_results(form): JOIN co_user cu ON cc.user = cu.rowid WHERE 1 = 1 {players} + {command} {coords} {time} - '''.format(players=players_clause, coords=coords_clause, time=time_clause)) + '''.format(players=players_clause, command=command_clause, coords=coords_clause, time=time_clause)) # Login/Logout if form.login_logout: diff --git a/migrations/0002_preset.py b/migrations/0002_preset.py index 8dd2cdc..fe15e02 100644 --- a/migrations/0002_preset.py +++ b/migrations/0002_preset.py @@ -1,4 +1,4 @@ -# Generated by Django 2.2.3 on 2019-09-30 21:59 +# Generated by Django 2.2.3 on 2019-10-01 04:28 from django.db import migrations, models @@ -23,17 +23,17 @@ class Migration(migrations.Migration): ('interact', models.BooleanField(default=False)), ('login_logout', models.BooleanField(default=False)), ('sign_place', models.BooleanField(default=False)), - ('worlds', models.CharField(default='', max_length=20)), + ('worlds', models.CharField(blank=True, default='', max_length=20)), ('ignore_environment', models.BooleanField(default=False)), ('oldest_first', models.BooleanField(default=False)), - ('players', models.CharField(max_length=50)), - ('x', models.CharField(default='', max_length=10)), - ('y', models.CharField(default='', max_length=10)), - ('z', models.CharField(default='', max_length=10)), - ('radius', models.CharField(default='', max_length=10)), - ('blocks', models.CharField(default='', max_length=50)), - ('date_from', models.CharField(default='', max_length=10)), - ('date_to', models.CharField(default='', max_length=10)), + ('players', models.CharField(blank=True, max_length=50)), + ('x', models.CharField(blank=True, default='', max_length=10)), + ('y', models.CharField(blank=True, default='', max_length=10)), + ('z', models.CharField(blank=True, default='', max_length=10)), + ('radius', models.CharField(blank=True, default='', max_length=10)), + ('blocks', models.CharField(blank=True, default='', max_length=50)), + ('date_from', models.CharField(blank=True, default='', max_length=50)), + ('date_to', models.CharField(blank=True, default='', max_length=50)), ('enabled', models.BooleanField(default=True)), ], ), diff --git a/models.py b/models.py index 0702fdf..f611f71 100644 --- a/models.py +++ b/models.py @@ -312,8 +312,8 @@ class Preset(models.Model): z = models.CharField(max_length=10, default="", blank=True) radius = models.CharField(max_length=10, default="", blank=True) blocks = models.CharField(max_length=50, default="", blank=True) - date_from = models.CharField(max_length=10, default="", blank=True) - date_to = models.CharField(max_length=10, default="", blank=True) + date_from = models.CharField(max_length=50, default="", blank=True) + date_to = models.CharField(max_length=50, default="", blank=True) enabled = models.BooleanField(default=True) @property @@ -337,7 +337,8 @@ class Preset(models.Model): if self.sign_place: params.append("sign_place=on") if self.worlds: - params.append("world=" + self.worlds) + for world in self.worlds.split(","): + params.append("world=" + world) if self.ignore_environment: params.append("ignore_environment=on") if self.oldest_first: @@ -360,6 +361,9 @@ class Preset(models.Model): params.append("date_to=" + self.date_to) return url + "&".join(params) + def __str__(self): + return self.name + class GUIResult(models.Model): type = models.TextField() diff --git a/templates/coreprotect/coreprotect.html b/templates/coreprotect/coreprotect.html index 3d1326d..f40b546 100644 --- a/templates/coreprotect/coreprotect.html +++ b/templates/coreprotect/coreprotect.html @@ -75,30 +75,25 @@ -
+ {% if presets %} +
-

- Page Size -

-
+

+ Presets +

+

- + + {% for preset in presets %} + + {% endfor %}

-
- - - {% for preset in presets %} - {{ preset.name }} - {% endfor %} +
+ {% endif %} @@ -159,6 +154,27 @@
+

+ Page Size +

+
+

+ + + +

+
+ + +
+

@@ -282,5 +298,13 @@ document.getElementById("export").addEventListener("click", function() { exportTableToCSV("coreprotect.csv", "results"); }); + + {% if presets %} + document.getElementById("preset").addEventListener("change", function() { + if (this.value !== "") { + location.href = this.value; + } + }); + {% endif %} {% endblock %} \ No newline at end of file diff --git a/utils.py b/utils.py index 3dab566..77762c6 100644 --- a/utils.py +++ b/utils.py @@ -1,3 +1,6 @@ +from datetime import datetime, timedelta +import ast + def checkbox(value): return True if value == "on" else False @@ -6,4 +9,27 @@ def safe_int(value): try: return int(value) except: - return 0 \ No newline at end of file + return 0 + + +def time_to_form(date_time): + if date_time == "~T": + return datetime.today() + elif date_time == "~N": + return datetime.now() + elif date_time == "~Y": + return datetime.today() - timedelta(days=1) + elif date_time == "": + return "" + else: + return datetime.utcfromtimestamp(float(date_time)) + + +def form_to_time(date_time): + dt = ast.literal_eval(date_time) + if dt[0] in ["~T", "~N", "~Y"]: + return dt[0] + else: + dt[0] = dt[0] if dt[0] else datetime.now().strftime("%Y-%m-%d") + dt[1] = dt[1] if dt[1] else "00:00:00" + return datetime.strptime(" ".join(dt), "%Y-%m-%d %H:%M:%S").timestamp() -- 2.41.0 From 8887559cf437841dec3864527b4d95b806cea7e9 Mon Sep 17 00:00:00 2001 From: jolheiser Date: Thu, 10 Feb 2022 20:17:38 -0600 Subject: [PATCH 4/4] Optimized imports Signed-off-by: Etzelia # Conflicts: # gui.py --- admin.py | 28 +++++----------------------- gui.py | 4 ++-- models.py | 9 +++++---- utils.py | 3 ++- views.py | 7 ++++--- 5 files changed, 18 insertions(+), 33 deletions(-) diff --git a/admin.py b/admin.py index dd42891..cbda5b9 100644 --- a/admin.py +++ b/admin.py @@ -1,11 +1,11 @@ +import ast + +from django import forms from django.contrib import admin from django.contrib.admin import widgets as admin_widgets -from django import forms -import ast -from django_coreprotect.utils import time_to_form, form_to_time -from django_coreprotect.models import CoArtMap, CoBlock, CoBlockdataMap, CoChat, CoCommand, CoContainer, CoDatabaseLock, \ - CoEntity, CoEntityMap, CoMaterialMap, CoSession, CoSign, CoSkull, CoUser, CoUsernameLog, CoVersion, CoWorld, Preset +from django_coreprotect.models import CoWorld, Preset +from django_coreprotect.utils import time_to_form, form_to_time class PresetAdminForm(forms.ModelForm): @@ -49,24 +49,6 @@ class PresetAdmin(admin.ModelAdmin): try: - pass - # admin.site.register(CoArtMap) - # admin.site.register(CoBlock) - # admin.site.register(CoBlockdataMap) - # admin.site.register(CoChat) - # admin.site.register(CoCommand) - # admin.site.register(CoContainer) - # admin.site.register(CoDatabaseLock) - # admin.site.register(CoEntity) - # admin.site.register(CoEntityMap) - # admin.site.register(CoMaterialMap) - # admin.site.register(CoSession) - # admin.site.register(CoSign) - # admin.site.register(CoSkull) - # admin.site.register(CoUser) - # admin.site.register(CoUsernameLog) - # admin.site.register(CoVersion) - # admin.site.register(CoWorld) admin.site.register(Preset, PresetAdmin) except admin.sites.AlreadyRegistered: pass diff --git a/gui.py b/gui.py index 767cebd..b902502 100644 --- a/gui.py +++ b/gui.py @@ -1,7 +1,7 @@ +from datetime import datetime + from django_coreprotect.models import CoWorld, GUIResult from django_coreprotect.utils import safe_int, checkbox, time_to_form -from datetime import datetime -from django.db import connection class GUIForm: diff --git a/models.py b/models.py index f611f71..15bede9 100644 --- a/models.py +++ b/models.py @@ -1,8 +1,9 @@ -from django.db import models -from django.db.models import Q -from django.shortcuts import reverse -from django.contrib.auth.models import User from datetime import datetime + +from django.contrib.auth.models import User +from django.db import models +from django.shortcuts import reverse + from django_coreprotect.utils import safe_int diff --git a/utils.py b/utils.py index 77762c6..c8ddeae 100644 --- a/utils.py +++ b/utils.py @@ -1,5 +1,6 @@ -from datetime import datetime, timedelta import ast +from datetime import datetime, timedelta + def checkbox(value): return True if value == "on" else False diff --git a/views.py b/views.py index 3a80f30..1596230 100644 --- a/views.py +++ b/views.py @@ -1,10 +1,11 @@ +from django.http.response import JsonResponse from django.shortcuts import render from django.views.generic import View -from django.http.response import JsonResponse -from django_coreprotect.gui import gui_data, gui_results + from django_coreprotect.activity import activity_data, activity_results -from django_coreprotect.utils import safe_int +from django_coreprotect.gui import gui_data, gui_results from django_coreprotect.models import Preset +from django_coreprotect.utils import safe_int class GUI(View): -- 2.41.0