From 1d9688bfb5f3f0b80eaf1f98b11de1dcdb48d33f Mon Sep 17 00:00:00 2001 From: kevin Date: Tue, 6 Sep 2022 14:44:55 +1000 Subject: [PATCH 1/9] Removed upper bound on django --- error_tracker/django/__init__.py | 2 +- error_tracker/django/admin.py | 3 ++- .../django/templates/error_tracker/detail.html | 11 +++++++++++ 3 files changed, 14 insertions(+), 2 deletions(-) mode change 100755 => 100644 error_tracker/django/templates/error_tracker/detail.html diff --git a/error_tracker/django/__init__.py b/error_tracker/django/__init__.py index 0d6c946..73d4af2 100644 --- a/error_tracker/django/__init__.py +++ b/error_tracker/django/__init__.py @@ -25,7 +25,7 @@ def get_exception_model(): from .models import ErrorModel model_path = APP_ERROR_DB_MODEL if model_path is None: - warnings.warn("APP_ERROR_DB_MODEL is not set using default model") + warnings.warn("APP_ERROR_DB_MODEL is not set. Using default model") return ErrorModel try: return django_apps.get_model(model_path, require_ready=False) diff --git a/error_tracker/django/admin.py b/error_tracker/django/admin.py index 7e5722e..5878a06 100644 --- a/error_tracker/django/admin.py +++ b/error_tracker/django/admin.py @@ -14,6 +14,7 @@ def has_add_permission(self, request): 'path', 'method', 'exception_name', + 'exception_text', 'count', 'created_on', 'last_seen', @@ -25,7 +26,7 @@ def has_add_permission(self, request): 'notification_sent', 'ticket_raised', ) - search_fields = ('host', 'path', 'exception_name',) + search_fields = ('host', 'path', 'exception_name', 'exception_text',) change_form_template = 'error_tracker/admin/change_form.html' def changeform_view(self, request, object_id=None, form_url='', extra_context=None): diff --git a/error_tracker/django/templates/error_tracker/detail.html b/error_tracker/django/templates/error_tracker/detail.html old mode 100755 new mode 100644 index 961873a..480ffd9 --- a/error_tracker/django/templates/error_tracker/detail.html +++ b/error_tracker/django/templates/error_tracker/detail.html @@ -17,6 +17,17 @@

{{ error }}

+
+
{%trans 'Type' %}
+
{%trans 'Text' %}
+
+ {{ obj.exception_name }} +
+
+ {{ obj.exception_text }} +
+
+
{%trans 'First time seen' %}
From 10bbb8f4412b14097aa71099a7739932294a2490 Mon Sep 17 00:00:00 2001 From: kevin Date: Tue, 6 Sep 2022 14:45:52 +1000 Subject: [PATCH 2/9] Removed upper bound on django --- error_tracker/django/middleware.py | 10 ++++++---- error_tracker/django/models.py | 5 ++++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/error_tracker/django/middleware.py b/error_tracker/django/middleware.py index 63d9e2f..07918a2 100644 --- a/error_tracker/django/middleware.py +++ b/error_tracker/django/middleware.py @@ -99,13 +99,15 @@ def capture_exception(self, request=None, exception=None, additional_context=Non host = "" method = "" + ty, frames, frame_str, traceback_str, rhash, request_data = \ get_context_detail(request, masking, context_builder, additional_context=additional_context) - error = model.create_or_update_entity(rhash, host, path, method, - str(request_data), - get_exception_name(ty), - traceback_str) + error = model.create_or_update_entity(rhash=rhash, host=host, path=path, method=method, + request_data=str(request_data), + exception_name=get_exception_name(ty), + exception_text=str(debug_args), + traceback=traceback_str) ErrorTracker._post_process(request, frame_str, frames, error) diff --git a/error_tracker/django/models.py b/error_tracker/django/models.py index 0c10b6b..203a176 100644 --- a/error_tracker/django/models.py +++ b/error_tracker/django/models.py @@ -26,6 +26,7 @@ class AbstractErrorModel(models.Model, ModelMixin): method = models.CharField(max_length=64) request_data = models.TextField() exception_name = models.CharField(max_length=256) + exception_text = models.CharField(max_length=1256) traceback = models.TextField() count = models.IntegerField(default=0) created_on = models.DateTimeField(auto_now=True) @@ -62,12 +63,14 @@ def get_entity(cls, rhash): return cls.objects.get(hash=rhash) @classmethod - def create_or_update_entity(cls, rhash, host, path, method, request_data, exception_name, traceback): + def create_or_update_entity(cls, rhash, host, path, method, request_data, exception_name, + exception_text, traceback): try: obj, created = cls.objects.get_or_create(hash=rhash) if created: obj.host, obj.path, obj.method, obj.request_data, obj.exception_name, obj.traceback = \ host, path, method, request_data, exception_name, traceback + obj.exception_text = exception_text obj.count = 1 obj.save() else: From 181b65b2d38be2f864fa5279f12ccb91725d63d8 Mon Sep 17 00:00:00 2001 From: Kevin Curtis <64267339+kc2684@users.noreply.github.com> Date: Tue, 6 Sep 2022 17:42:41 +1000 Subject: [PATCH 3/9] Update __init__.py --- error_tracker/django/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/error_tracker/django/__init__.py b/error_tracker/django/__init__.py index 73d4af2..d18bb52 100644 --- a/error_tracker/django/__init__.py +++ b/error_tracker/django/__init__.py @@ -27,6 +27,8 @@ def get_exception_model(): if model_path is None: warnings.warn("APP_ERROR_DB_MODEL is not set. Using default model") return ErrorModel + elif model_path == 'UseDefault': + return ErrorModel try: return django_apps.get_model(model_path, require_ready=False) except ValueError: From 3e2a7753dec9dfd7cdfd41869753c655c9151964 Mon Sep 17 00:00:00 2001 From: Kevin Curtis <64267339+kc2684@users.noreply.github.com> Date: Tue, 6 Sep 2022 17:58:29 +1000 Subject: [PATCH 4/9] Added UseDefault option with no warning Added UseDefault option that uses the default without issuing a warning message --- error_tracker/libs/utils.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/error_tracker/libs/utils.py b/error_tracker/libs/utils.py index 3aceace..4943487 100644 --- a/error_tracker/libs/utils.py +++ b/error_tracker/libs/utils.py @@ -110,6 +110,8 @@ def get_class_from_path(module_path, super_class, raise_exception=True, def get_class_instance(module_path, mixin, default, message_prefix, *args): + if module_path == 'UseDefault': + return default(*args) if module_path is not None: module = get_class_from_path(module_path, mixin, raise_exception=False, From a223762a46d4e96793e8ddf5666504c0b66c6a59 Mon Sep 17 00:00:00 2001 From: kevin Date: Wed, 7 Sep 2022 13:50:29 +1000 Subject: [PATCH 5/9] Add abilty to suppress warnings --- error_tracker/django/__init__.py | 11 ++++------- error_tracker/django/middleware.py | 18 +++--------------- error_tracker/django/settings.py | 2 ++ .../django/templates/error_tracker/detail.html | 2 +- error_tracker/django/utils.py | 9 +++------ error_tracker/libs/utils.py | 6 ++++-- 6 files changed, 17 insertions(+), 31 deletions(-) diff --git a/error_tracker/django/__init__.py b/error_tracker/django/__init__.py index d18bb52..dee3253 100644 --- a/error_tracker/django/__init__.py +++ b/error_tracker/django/__init__.py @@ -25,21 +25,18 @@ def get_exception_model(): from .models import ErrorModel model_path = APP_ERROR_DB_MODEL if model_path is None: - warnings.warn("APP_ERROR_DB_MODEL is not set. Using default model") - return ErrorModel - elif model_path == 'UseDefault': + if not APP_ERROR_SUPPRESS_DEFAULT_WARNING: + warnings.warn("APP_ERROR_DB_MODEL is not set. Using default model") return ErrorModel try: return django_apps.get_model(model_path, require_ready=False) except ValueError: - model = get_class_from_path(model_path, ModelMixin, raise_exception=False, - warning_message="Model " + model_path + " is not importable") + model = get_class_from_path(model_path, ModelMixin, raise_exception=False, warning_message=f"Model {model_path} is not importable") if model is not None: return model warnings.warn("APP_ERROR_DB_MODEL must be of the form 'app_label.model_name'") except LookupError: - model = get_class_from_path(model_path, ModelMixin, raise_exception=False, - warning_message="Model " + model_path + " is not importable") + model = get_class_from_path(model_path, ModelMixin, raise_exception=False, warning_message=f"Model {model_path} is not importable") if model is not None: return model warnings.warn( diff --git a/error_tracker/django/middleware.py b/error_tracker/django/middleware.py index 07918a2..7606beb 100644 --- a/error_tracker/django/middleware.py +++ b/error_tracker/django/middleware.py @@ -61,21 +61,10 @@ def _raise_ticket(request, error): @staticmethod def _post_process(request, frame_str, frames, error): - send_notification = True - raise_ticket = True - - if request is not None: - message = ('URL: %s' % request.path) + '\n\n' - else: - message = "" + message = f'URL: {request.path}' + '\n\n' if request is not None else "" message += frame_str - - if APP_ERROR_NOTIFICATION_ONCE is True and error.notification_sent is True: - send_notification = False - - if APP_ERROR_TICKET_ONCE is True and error.ticket_raised is True: - raise_ticket = False - + send_notification = APP_ERROR_NOTIFICATION_ONCE is not True or error.notification_sent is not True + raise_ticket = APP_ERROR_TICKET_ONCE is not True or error.ticket_raised is not True if send_notification: ErrorTracker._send_notification(request, message, frames[-1][:-1], error) if raise_ticket: @@ -99,7 +88,6 @@ def capture_exception(self, request=None, exception=None, additional_context=Non host = "" method = "" - ty, frames, frame_str, traceback_str, rhash, request_data = \ get_context_detail(request, masking, context_builder, additional_context=additional_context) diff --git a/error_tracker/django/settings.py b/error_tracker/django/settings.py index 76d693d..cc3c4c8 100644 --- a/error_tracker/django/settings.py +++ b/error_tracker/django/settings.py @@ -50,3 +50,5 @@ def get(key, default): APP_ERROR_TICKET_ONCE = get('APP_ERROR_NOTIFICATION_ONCE', False) # Use django admin site APP_ERROR_USE_DJANGO_ADMIN_SITE = get('APP_ERROR_USE_DJANGO_ADMIN_SITE', False) +# suppress default warnings +APP_ERROR_SUPPRESS_DEFAULT_WARNING = get('APP_ERROR_SUPPRESS_DEFAULT_WARNING', False) diff --git a/error_tracker/django/templates/error_tracker/detail.html b/error_tracker/django/templates/error_tracker/detail.html index 480ffd9..86ed674 100644 --- a/error_tracker/django/templates/error_tracker/detail.html +++ b/error_tracker/django/templates/error_tracker/detail.html @@ -17,7 +17,7 @@

{{ error }}

-
+
{%trans 'Type' %}
{%trans 'Text' %}
diff --git a/error_tracker/django/utils.py b/error_tracker/django/utils.py index 0b5afa6..6d5cb5a 100644 --- a/error_tracker/django/utils.py +++ b/error_tracker/django/utils.py @@ -6,6 +6,7 @@ # :license: BSD-3-Clause # +import contextlib import json import re @@ -32,17 +33,13 @@ def _get_form_data(request): try: body = request.data except AttributeError: - try: + with contextlib.suppress(RawPostDataException): body = request.body - except RawPostDataException: - pass if body is not None: - try: + with contextlib.suppress(ImportError): from rest_framework.request import Request if isinstance(body, Request): form = body.data - except ImportError: - pass if len(form) == 0 and len(body) > 0: try: form = json.loads(body, encoding="UTF-8") diff --git a/error_tracker/libs/utils.py b/error_tracker/libs/utils.py index 4943487..ef8bbb2 100644 --- a/error_tracker/libs/utils.py +++ b/error_tracker/libs/utils.py @@ -13,6 +13,7 @@ from error_tracker.libs.exception_formatter import format_exception from error_tracker.libs.mixins import MaskingMixin +from error_tracker.django.settings import APP_ERROR_SUPPRESS_DEFAULT_WARNING class Masking(MaskingMixin): @@ -119,8 +120,9 @@ def get_class_instance(module_path, mixin, default, message_prefix, *args): if module is not None: return module(*args) if default is not None: - message = "Default " + message_prefix + " module will be used" - warnings.warn(message) + if not APP_ERROR_SUPPRESS_DEFAULT_WARNING: + message = "Default " + message_prefix + " module will be used" + warnings.warn(message) return default(*args) From 1617f4fb28e9d49e68f584f824c1ef3d2975afc9 Mon Sep 17 00:00:00 2001 From: kevin Date: Wed, 7 Sep 2022 14:45:26 +1000 Subject: [PATCH 6/9] Sourcery code reformating --- error_tracker/django/models.py | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/error_tracker/django/models.py b/error_tracker/django/models.py index 203a176..71b0f1a 100644 --- a/error_tracker/django/models.py +++ b/error_tracker/django/models.py @@ -40,21 +40,14 @@ def get_exceptions_per_page(cls, page_number=1, **query): if 'page' in query: page_number = query['page'] del query['page'] - query = {"{}__icontains".format(k): v for k, v in query.items()} - - if not query: - records = cls.objects.all().order_by('last_seen') - else: - records = cls.objects.filter(**query).order_by('last_seen') + query = {f"{k}__icontains": v for k, v in query.items()} + records = cls.objects.filter(**query).order_by('last_seen') if query else cls.objects.all().order_by('last_seen') paginator = Paginator(records, EXCEPTION_APP_DEFAULT_LIST_SIZE) try: page = paginator.page(page_number) - return Page(page.has_next(), - page.next_page_number() if page.has_next() else None, - page.has_previous(), - page.previous_page_number() if page.has_previous() else None, - page.object_list) + return Page(page.has_next(), page.next_page_number() if page.has_next() else None, page.has_previous(), page.previous_page_number() if page.has_previous() else None, page.object_list) + except EmptyPage: return Page(False, None, True, paginator.num_pages, []) @@ -63,8 +56,7 @@ def get_entity(cls, rhash): return cls.objects.get(hash=rhash) @classmethod - def create_or_update_entity(cls, rhash, host, path, method, request_data, exception_name, - exception_text, traceback): + def create_or_update_entity(cls, rhash, host, path, method, request_data, exception_name, exception_text, traceback): try: obj, created = cls.objects.get_or_create(hash=rhash) if created: From 1e77186a70c3a16c8bebdca6a301d30537edcc1a Mon Sep 17 00:00:00 2001 From: kevin Date: Wed, 7 Sep 2022 16:15:51 +1000 Subject: [PATCH 7/9] Not Sure --- .../0003_errormodel_exception_text.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 error_tracker/django/migrations/0003_errormodel_exception_text.py diff --git a/error_tracker/django/migrations/0003_errormodel_exception_text.py b/error_tracker/django/migrations/0003_errormodel_exception_text.py new file mode 100644 index 0000000..59b78b4 --- /dev/null +++ b/error_tracker/django/migrations/0003_errormodel_exception_text.py @@ -0,0 +1,19 @@ +# Generated by Django 4.0.4 on 2022-09-06 04:00 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('error_tracker', '0002_auto_20201018_1311'), + ] + + operations = [ + migrations.AddField( + model_name='errormodel', + name='exception_text', + field=models.CharField(default=0, max_length=1256), + preserve_default=False, + ), + ] From 3137a293d7243e69ff3681717ddfb093757c16e1 Mon Sep 17 00:00:00 2001 From: kevin Date: Tue, 13 Sep 2022 12:53:04 +1000 Subject: [PATCH 8/9] Add exception_text to model middleware and utils --- error_tracker/django/__init__.py | 3 ++- error_tracker/django/middleware.py | 2 +- .../django/migrations/0001_initial.py | 6 ++++- .../migrations/0002_auto_20201018_1311.py | 23 ------------------- .../0003_errormodel_exception_text.py | 19 --------------- error_tracker/django/utils.py | 1 - 6 files changed, 8 insertions(+), 46 deletions(-) delete mode 100644 error_tracker/django/migrations/0002_auto_20201018_1311.py delete mode 100644 error_tracker/django/migrations/0003_errormodel_exception_text.py diff --git a/error_tracker/django/__init__.py b/error_tracker/django/__init__.py index dee3253..217c55e 100644 --- a/error_tracker/django/__init__.py +++ b/error_tracker/django/__init__.py @@ -36,7 +36,8 @@ def get_exception_model(): return model warnings.warn("APP_ERROR_DB_MODEL must be of the form 'app_label.model_name'") except LookupError: - model = get_class_from_path(model_path, ModelMixin, raise_exception=False, warning_message=f"Model {model_path} is not importable") + model = get_class_from_path(model_path, ModelMixin, raise_exception=False, + warning_message=f"Model {model_path} is not importable") if model is not None: return model warnings.warn( diff --git a/error_tracker/django/middleware.py b/error_tracker/django/middleware.py index 7606beb..fcb6b41 100644 --- a/error_tracker/django/middleware.py +++ b/error_tracker/django/middleware.py @@ -94,7 +94,7 @@ def capture_exception(self, request=None, exception=None, additional_context=Non error = model.create_or_update_entity(rhash=rhash, host=host, path=path, method=method, request_data=str(request_data), exception_name=get_exception_name(ty), - exception_text=str(debug_args), + exception_text=str(exception.args), traceback=traceback_str) ErrorTracker._post_process(request, frame_str, frames, error) diff --git a/error_tracker/django/migrations/0001_initial.py b/error_tracker/django/migrations/0001_initial.py index d340815..79dfc19 100644 --- a/error_tracker/django/migrations/0001_initial.py +++ b/error_tracker/django/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.2.7 on 2019-11-29 07:29 +# Generated by Django 4.0.4 on 2022-09-09 05:47 from django.db import migrations, models import error_tracker.libs.mixins @@ -21,13 +21,17 @@ class Migration(migrations.Migration): ('method', models.CharField(max_length=64)), ('request_data', models.TextField()), ('exception_name', models.CharField(max_length=256)), + ('exception_text', models.CharField(max_length=1256)), ('traceback', models.TextField()), ('count', models.IntegerField(default=0)), ('created_on', models.DateTimeField(auto_now=True)), ('last_seen', models.DateTimeField(auto_now=True, db_index=True)), + ('notification_sent', models.BooleanField(default=False)), + ('ticket_raised', models.BooleanField(default=False)), ], options={ 'db_table': 'exceptions', + 'abstract': False, 'swappable': 'APP_ERROR_DB_MODEL', }, bases=(models.Model, error_tracker.libs.mixins.ModelMixin), diff --git a/error_tracker/django/migrations/0002_auto_20201018_1311.py b/error_tracker/django/migrations/0002_auto_20201018_1311.py deleted file mode 100644 index 3634abe..0000000 --- a/error_tracker/django/migrations/0002_auto_20201018_1311.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 3.1.2 on 2020-10-18 11:11 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('error_tracker', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='errormodel', - name='notification_sent', - field=models.BooleanField(default=False), - ), - migrations.AddField( - model_name='errormodel', - name='ticket_raised', - field=models.BooleanField(default=False), - ), - ] \ No newline at end of file diff --git a/error_tracker/django/migrations/0003_errormodel_exception_text.py b/error_tracker/django/migrations/0003_errormodel_exception_text.py deleted file mode 100644 index 59b78b4..0000000 --- a/error_tracker/django/migrations/0003_errormodel_exception_text.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 4.0.4 on 2022-09-06 04:00 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('error_tracker', '0002_auto_20201018_1311'), - ] - - operations = [ - migrations.AddField( - model_name='errormodel', - name='exception_text', - field=models.CharField(default=0, max_length=1256), - preserve_default=False, - ), - ] diff --git a/error_tracker/django/utils.py b/error_tracker/django/utils.py index 6d5cb5a..fb06df6 100644 --- a/error_tracker/django/utils.py +++ b/error_tracker/django/utils.py @@ -29,7 +29,6 @@ def _get_form_data(request): return form post = request.POST if post is None or len(post) == 0: - body = None try: body = request.data except AttributeError: From 753418bdefb41379fa2b524300970aa96fb454a8 Mon Sep 17 00:00:00 2001 From: kc2684 <64267339+kc2684@users.noreply.github.com> Date: Mon, 5 Feb 2024 12:52:07 +1100 Subject: [PATCH 9/9] Update file permissions and modes --- MANIFEST.in | 0 error_tracker/django/templates/error_tracker/base.html | 0 error_tracker/django/templates/error_tracker/list.html | 0 error_tracker/django/urls.py | 0 error_tracker/flask/__init__.py | 0 error_tracker/flask/defaults.py | 0 error_tracker/flask/flask_error.py | 0 error_tracker/flask/templates/error_tracker/base.html | 0 error_tracker/flask/templates/error_tracker/detail.html | 0 error_tracker/flask/templates/error_tracker/list.html | 0 error_tracker/libs/exception_formatter.py | 0 error_tracker/libs/mixins.py | 0 examples/DjangoSample/manage.py | 0 examples/flask-sample/app.py | 0 examples/flask-sample/settings.py | 0 examples/flask-sample/templates/401.html | 0 examples/flask-sample/templates/500.html | 0 requirements-dev.txt | 0 run-tests.sh | 0 setup.py | 0 tests/DjangoTest/tests/test_basic.py | 0 tests/FlaskTest/configs/__init__.py | 0 tests/FlaskTest/configs/custom_mask_rule.py | 0 tests/FlaskTest/configs/masking_disabled.py | 0 tests/FlaskTest/configs/notification_config_disabled.py | 0 tests/FlaskTest/configs/notification_config_enabled.py | 0 tests/FlaskTest/test_basic.py | 0 tests/__init__.py | 0 28 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 MANIFEST.in mode change 100755 => 100644 error_tracker/django/templates/error_tracker/base.html mode change 100755 => 100644 error_tracker/django/templates/error_tracker/list.html mode change 100755 => 100644 error_tracker/django/urls.py mode change 100755 => 100644 error_tracker/flask/__init__.py mode change 100755 => 100644 error_tracker/flask/defaults.py mode change 100755 => 100644 error_tracker/flask/flask_error.py mode change 100755 => 100644 error_tracker/flask/templates/error_tracker/base.html mode change 100755 => 100644 error_tracker/flask/templates/error_tracker/detail.html mode change 100755 => 100644 error_tracker/flask/templates/error_tracker/list.html mode change 100755 => 100644 error_tracker/libs/exception_formatter.py mode change 100755 => 100644 error_tracker/libs/mixins.py mode change 100755 => 100644 examples/DjangoSample/manage.py mode change 100755 => 100644 examples/flask-sample/app.py mode change 100755 => 100644 examples/flask-sample/settings.py mode change 100755 => 100644 examples/flask-sample/templates/401.html mode change 100755 => 100644 examples/flask-sample/templates/500.html mode change 100755 => 100644 requirements-dev.txt mode change 100755 => 100644 run-tests.sh mode change 100755 => 100644 setup.py mode change 100755 => 100644 tests/DjangoTest/tests/test_basic.py mode change 100755 => 100644 tests/FlaskTest/configs/__init__.py mode change 100755 => 100644 tests/FlaskTest/configs/custom_mask_rule.py mode change 100755 => 100644 tests/FlaskTest/configs/masking_disabled.py mode change 100755 => 100644 tests/FlaskTest/configs/notification_config_disabled.py mode change 100755 => 100644 tests/FlaskTest/configs/notification_config_enabled.py mode change 100755 => 100644 tests/FlaskTest/test_basic.py mode change 100755 => 100644 tests/__init__.py diff --git a/MANIFEST.in b/MANIFEST.in old mode 100755 new mode 100644 diff --git a/error_tracker/django/templates/error_tracker/base.html b/error_tracker/django/templates/error_tracker/base.html old mode 100755 new mode 100644 diff --git a/error_tracker/django/templates/error_tracker/list.html b/error_tracker/django/templates/error_tracker/list.html old mode 100755 new mode 100644 diff --git a/error_tracker/django/urls.py b/error_tracker/django/urls.py old mode 100755 new mode 100644 diff --git a/error_tracker/flask/__init__.py b/error_tracker/flask/__init__.py old mode 100755 new mode 100644 diff --git a/error_tracker/flask/defaults.py b/error_tracker/flask/defaults.py old mode 100755 new mode 100644 diff --git a/error_tracker/flask/flask_error.py b/error_tracker/flask/flask_error.py old mode 100755 new mode 100644 diff --git a/error_tracker/flask/templates/error_tracker/base.html b/error_tracker/flask/templates/error_tracker/base.html old mode 100755 new mode 100644 diff --git a/error_tracker/flask/templates/error_tracker/detail.html b/error_tracker/flask/templates/error_tracker/detail.html old mode 100755 new mode 100644 diff --git a/error_tracker/flask/templates/error_tracker/list.html b/error_tracker/flask/templates/error_tracker/list.html old mode 100755 new mode 100644 diff --git a/error_tracker/libs/exception_formatter.py b/error_tracker/libs/exception_formatter.py old mode 100755 new mode 100644 diff --git a/error_tracker/libs/mixins.py b/error_tracker/libs/mixins.py old mode 100755 new mode 100644 diff --git a/examples/DjangoSample/manage.py b/examples/DjangoSample/manage.py old mode 100755 new mode 100644 diff --git a/examples/flask-sample/app.py b/examples/flask-sample/app.py old mode 100755 new mode 100644 diff --git a/examples/flask-sample/settings.py b/examples/flask-sample/settings.py old mode 100755 new mode 100644 diff --git a/examples/flask-sample/templates/401.html b/examples/flask-sample/templates/401.html old mode 100755 new mode 100644 diff --git a/examples/flask-sample/templates/500.html b/examples/flask-sample/templates/500.html old mode 100755 new mode 100644 diff --git a/requirements-dev.txt b/requirements-dev.txt old mode 100755 new mode 100644 diff --git a/run-tests.sh b/run-tests.sh old mode 100755 new mode 100644 diff --git a/setup.py b/setup.py old mode 100755 new mode 100644 diff --git a/tests/DjangoTest/tests/test_basic.py b/tests/DjangoTest/tests/test_basic.py old mode 100755 new mode 100644 diff --git a/tests/FlaskTest/configs/__init__.py b/tests/FlaskTest/configs/__init__.py old mode 100755 new mode 100644 diff --git a/tests/FlaskTest/configs/custom_mask_rule.py b/tests/FlaskTest/configs/custom_mask_rule.py old mode 100755 new mode 100644 diff --git a/tests/FlaskTest/configs/masking_disabled.py b/tests/FlaskTest/configs/masking_disabled.py old mode 100755 new mode 100644 diff --git a/tests/FlaskTest/configs/notification_config_disabled.py b/tests/FlaskTest/configs/notification_config_disabled.py old mode 100755 new mode 100644 diff --git a/tests/FlaskTest/configs/notification_config_enabled.py b/tests/FlaskTest/configs/notification_config_enabled.py old mode 100755 new mode 100644 diff --git a/tests/FlaskTest/test_basic.py b/tests/FlaskTest/test_basic.py old mode 100755 new mode 100644 diff --git a/tests/__init__.py b/tests/__init__.py old mode 100755 new mode 100644