diff --git a/README.md b/README.md index a6a7049..bcb558f 100644 --- a/README.md +++ b/README.md @@ -69,4 +69,16 @@ python dedup.py 0.jpg 1.jpg -scores ### Files made by get_dups Scripts: error level: 0 = NOT a Dup, 1 = Duplicate, 2 = Close Match, 5 = Same GPS GEO-location, 8 = Invalid Image, 9 = File Too small/big. Possible files: dups.txt, alike.txt, sameGPS.txt, invalid.txt, size.txt. +# Run website: +First activate the python environment, then: +``` +pip install django +cd webapp +python manage.py runserver +``` +Visit http://127.0.0.1:8000 +Login as bob, password: guest +Wait a minute...for program to run it will compair a.jpg and b.jpg. +See: authapp/views.py + [] diff --git a/dedup.py b/dedup.py index 84ad83c..dda89e4 100644 --- a/dedup.py +++ b/dedup.py @@ -89,6 +89,11 @@ def main(): print("Usage: python3 dedup.py file1.jpg file2.jpg") sys.exit(3) + if "-noansi" in sys.argv: + delibs.disable_ansi() + elif "-ansi" in sys.argv: + delibs.enable_ansi() + file1 = sys.argv[1] file2 = sys.argv[2] diff --git a/delibs.py b/delibs.py index 0c214fd..49218ea 100644 --- a/delibs.py +++ b/delibs.py @@ -23,6 +23,13 @@ RESET = "\033[0m" start = time.perf_counter() +def enable_ansi(): + global use_ANSI_Colors + use_ANSI_Colors = True +def disable_ansi(): + global use_ANSI_Colors + use_ANSI_Colors = False + def kill_all(): print("KILLING PROCESS") os.kill(os.getpid(), signal.SIGKILL) # Force kernel-level termination diff --git a/webapp/authapp/__init__.py b/webapp/authapp/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/webapp/authapp/admin.py b/webapp/authapp/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/webapp/authapp/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/webapp/authapp/apps.py b/webapp/authapp/apps.py new file mode 100644 index 0000000..ef802c9 --- /dev/null +++ b/webapp/authapp/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class AuthappConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'authapp' diff --git a/webapp/authapp/migrations/__init__.py b/webapp/authapp/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/webapp/authapp/models.py b/webapp/authapp/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/webapp/authapp/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/webapp/authapp/templates/authapp/home.html b/webapp/authapp/templates/authapp/home.html new file mode 100644 index 0000000..fd45829 --- /dev/null +++ b/webapp/authapp/templates/authapp/home.html @@ -0,0 +1,11 @@ + + +
+Please login...
+ Login + + diff --git a/webapp/authapp/templates/authapp/login.html b/webapp/authapp/templates/authapp/login.html new file mode 100644 index 0000000..010bef9 --- /dev/null +++ b/webapp/authapp/templates/authapp/login.html @@ -0,0 +1,23 @@ + + + +You have successfully logged in.
+ +Logout + +{{ script_output }}
diff --git a/webapp/authapp/tests.py b/webapp/authapp/tests.py
new file mode 100644
index 0000000..7ce503c
--- /dev/null
+++ b/webapp/authapp/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/webapp/authapp/urls.py b/webapp/authapp/urls.py
new file mode 100644
index 0000000..75095ac
--- /dev/null
+++ b/webapp/authapp/urls.py
@@ -0,0 +1,9 @@
+from django.urls import path
+from . import views
+
+urlpatterns = [
+ path('', views.login_view, name='login'), # Handles `/login/`
+ #path('login/', views.login_view, name='login'),
+ path('success/', views.success_view, name='success'),
+ path('logout/', views.logout_view, name='logout'), # New logout path
+]
diff --git a/webapp/authapp/views.py b/webapp/authapp/views.py
new file mode 100644
index 0000000..4ec1ef3
--- /dev/null
+++ b/webapp/authapp/views.py
@@ -0,0 +1,54 @@
+from django.shortcuts import render, redirect
+from django.contrib import messages
+import os
+import subprocess # To run external scripts
+
+def login_view(request):
+ if request.method == 'POST':
+ username = request.POST.get('username')
+ password = request.POST.get('password')
+
+ if username == 'bob' and password == 'guest':
+ # Set session variables
+ request.session['logged_in'] = True
+ request.session['username'] = username # Optional: Store username
+ messages.success(request, 'Login successful!')
+ return redirect('success') # Redirect to a success page
+ else:
+ messages.error(request, 'Invalid credentials!')
+
+ return render(request, 'authapp/login.html')
+
+def success_view(request):
+ # Check if user is logged in via session
+ if not request.session.get('logged_in'):
+ messages.error(request, 'You must log in first!')
+ return redirect('login') # Redirect to login page if not authenticated
+
+ # Define paths to your images (adjust as needed)
+ image1 = os.path.join('..', 'a.jpg') # Full path to a.jpg
+ image2 = os.path.join('..', 'b.jpg') # Full path to b.jpg
+
+ try:
+ result = subprocess.run(
+ ["python", "../dedup.py", image1, image2, "-noansi", "-scores"],
+ capture_output=True,
+ text=True
+ )
+ script_output = result.stdout
+ except Exception as e:
+ script_output = f"Error: {e}"
+
+ # Pass results to the template
+ return render(request, "authapp/success.html", {
+ "script_output": script_output,
+ })
+
+def home_view(request):
+ return render(request, 'authapp/home.html') # Create home.html in templates
+
+def logout_view(request):
+ # Clear session data
+ request.session.flush() # Or use del request.session['logged_in']
+ messages.success(request, 'You have been logged out.')
+ return redirect('login')
diff --git a/webapp/db.sqlite3 b/webapp/db.sqlite3
new file mode 100644
index 0000000..01bbbf5
Binary files /dev/null and b/webapp/db.sqlite3 differ
diff --git a/webapp/manage.py b/webapp/manage.py
new file mode 100755
index 0000000..96982b3
--- /dev/null
+++ b/webapp/manage.py
@@ -0,0 +1,22 @@
+#!/usr/bin/env python
+"""Django's command-line utility for administrative tasks."""
+import os
+import sys
+
+
+def main():
+ """Run administrative tasks."""
+ os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'webapp.settings')
+ try:
+ from django.core.management import execute_from_command_line
+ except ImportError as exc:
+ raise ImportError(
+ "Couldn't import Django. Are you sure it's installed and "
+ "available on your PYTHONPATH environment variable? Did you "
+ "forget to activate a virtual environment?"
+ ) from exc
+ execute_from_command_line(sys.argv)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/webapp/webapp/__init__.py b/webapp/webapp/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/webapp/webapp/asgi.py b/webapp/webapp/asgi.py
new file mode 100644
index 0000000..5bba2ab
--- /dev/null
+++ b/webapp/webapp/asgi.py
@@ -0,0 +1,16 @@
+"""
+ASGI config for webapp project.
+
+It exposes the ASGI callable as a module-level variable named ``application``.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/5.2/howto/deployment/asgi/
+"""
+
+import os
+
+from django.core.asgi import get_asgi_application
+
+os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'webapp.settings')
+
+application = get_asgi_application()
diff --git a/webapp/webapp/settings.py b/webapp/webapp/settings.py
new file mode 100644
index 0000000..608898e
--- /dev/null
+++ b/webapp/webapp/settings.py
@@ -0,0 +1,124 @@
+"""
+Django settings for webapp project.
+
+Generated by 'django-admin startproject' using Django 5.2.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/5.2/topics/settings/
+
+For the full list of settings and their values, see
+https://docs.djangoproject.com/en/5.2/ref/settings/
+"""
+
+from pathlib import Path
+
+# Build paths inside the project like this: BASE_DIR / 'subdir'.
+BASE_DIR = Path(__file__).resolve().parent.parent
+
+
+# Quick-start development settings - unsuitable for production
+# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/
+
+# SECURITY WARNING: keep the secret key used in production secret!
+SECRET_KEY = 'django-insecure-qnxipx50q#!yv1o(5dc_=#dc#_6jz^gt^^bhlm4b-hmeqa11=y'
+
+# SECURITY WARNING: don't run with debug turned on in production!
+DEBUG = True
+
+ALLOWED_HOSTS = []
+
+SESSION_COOKIE_AGE = 3600 # 1 hour in seconds
+
+# Application definition
+
+INSTALLED_APPS = [
+ 'django.contrib.admin',
+ 'django.contrib.auth',
+ 'django.contrib.contenttypes',
+ 'django.contrib.sessions',
+ 'django.contrib.messages',
+ 'django.contrib.staticfiles',
+ 'authapp',
+]
+
+MIDDLEWARE = [
+ 'django.middleware.security.SecurityMiddleware',
+ 'django.contrib.sessions.middleware.SessionMiddleware',
+ 'django.middleware.common.CommonMiddleware',
+ 'django.middleware.csrf.CsrfViewMiddleware',
+ 'django.contrib.auth.middleware.AuthenticationMiddleware',
+ 'django.contrib.messages.middleware.MessageMiddleware',
+ 'django.middleware.clickjacking.XFrameOptionsMiddleware',
+]
+
+ROOT_URLCONF = 'webapp.urls'
+
+TEMPLATES = [
+ {
+ 'BACKEND': 'django.template.backends.django.DjangoTemplates',
+ 'DIRS': [],
+ 'APP_DIRS': True,
+ 'OPTIONS': {
+ 'context_processors': [
+ 'django.template.context_processors.request',
+ 'django.contrib.auth.context_processors.auth',
+ 'django.contrib.messages.context_processors.messages',
+ ],
+ },
+ },
+]
+
+WSGI_APPLICATION = 'webapp.wsgi.application'
+
+
+# Database
+# https://docs.djangoproject.com/en/5.2/ref/settings/#databases
+
+DATABASES = {
+ 'default': {
+ 'ENGINE': 'django.db.backends.sqlite3',
+ 'NAME': BASE_DIR / 'db.sqlite3',
+ }
+}
+
+
+# Password validation
+# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators
+
+AUTH_PASSWORD_VALIDATORS = [
+ {
+ 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
+ },
+ {
+ 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
+ },
+ {
+ 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
+ },
+ {
+ 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
+ },
+]
+
+
+# Internationalization
+# https://docs.djangoproject.com/en/5.2/topics/i18n/
+
+LANGUAGE_CODE = 'en-us'
+
+TIME_ZONE = 'UTC'
+
+USE_I18N = True
+
+USE_TZ = True
+
+
+# Static files (CSS, JavaScript, Images)
+# https://docs.djangoproject.com/en/5.2/howto/static-files/
+
+STATIC_URL = 'static/'
+
+# Default primary key field type
+# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field
+
+DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
diff --git a/webapp/webapp/urls.py b/webapp/webapp/urls.py
new file mode 100644
index 0000000..522a51c
--- /dev/null
+++ b/webapp/webapp/urls.py
@@ -0,0 +1,25 @@
+"""
+URL configuration for webapp project.
+
+The `urlpatterns` list routes URLs to views. For more information please see:
+ https://docs.djangoproject.com/en/5.2/topics/http/urls/
+Examples:
+Function views
+ 1. Add an import: from my_app import views
+ 2. Add a URL to urlpatterns: path('', views.home, name='home')
+Class-based views
+ 1. Add an import: from other_app.views import Home
+ 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
+Including another URLconf
+ 1. Import the include() function: from django.urls import include, path
+ 2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
+"""
+from django.contrib import admin
+from django.urls import path, include
+from authapp.views import home_view # Add this
+
+urlpatterns = [
+ path('admin/', admin.site.urls),
+ path('login/', include('authapp.urls')), # Assuming authapp handles login
+ path('', home_view, name='home'), # Serve home.html at root
+]
diff --git a/webapp/webapp/wsgi.py b/webapp/webapp/wsgi.py
new file mode 100644
index 0000000..2371b93
--- /dev/null
+++ b/webapp/webapp/wsgi.py
@@ -0,0 +1,16 @@
+"""
+WSGI config for webapp project.
+
+It exposes the WSGI callable as a module-level variable named ``application``.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/5.2/howto/deployment/wsgi/
+"""
+
+import os
+
+from django.core.wsgi import get_wsgi_application
+
+os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'webapp.settings')
+
+application = get_wsgi_application()