diff --git a/He-Anlage 2024_1.Halbjahr.ods b/He-Anlage 2024_1.Halbjahr.ods new file mode 100644 index 0000000..9263bc9 Binary files /dev/null and b/He-Anlage 2024_1.Halbjahr.ods differ diff --git a/db.sqlite3 b/db.sqlite3 new file mode 100644 index 0000000..a57b2b8 Binary files /dev/null and b/db.sqlite3 differ diff --git a/excel_mimic/urls.py b/excel_mimic/urls.py index 6a61b93..83998a3 100644 --- a/excel_mimic/urls.py +++ b/excel_mimic/urls.py @@ -19,5 +19,5 @@ from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), # Admin site - path('', include('sheets.urls')), # Sheets app URLs + path('', include('Sheets.urls')), # Sheets app URLs ] \ No newline at end of file diff --git a/sheets/migrations/0006_client.py b/sheets/migrations/0006_client.py new file mode 100644 index 0000000..abca40c --- /dev/null +++ b/sheets/migrations/0006_client.py @@ -0,0 +1,21 @@ +# Generated by Django 5.1.5 on 2025-04-08 11:23 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('sheets', '0005_secondtableentry'), + ] + + operations = [ + migrations.CreateModel( + name='Client', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100)), + ('address', models.TextField()), + ], + ), + ] diff --git a/sheets/models.py b/sheets/models.py index 182688b..5617d6a 100644 --- a/sheets/models.py +++ b/sheets/models.py @@ -1,5 +1,12 @@ from django.db import models +class Client(models.Model): + name = models.CharField(max_length=100) + address = models.TextField() + + def __str__(self): + return self.name + class ExcelEntry(models.Model): name = models.CharField(max_length=100) age = models.IntegerField() diff --git a/sheets/templates/base.html b/sheets/templates/base.html new file mode 100644 index 0000000..151779f --- /dev/null +++ b/sheets/templates/base.html @@ -0,0 +1,22 @@ + + + + + {% block title %}My App{% endblock %} + + + + + + + {% block content %} + {% endblock %} + + diff --git a/sheets/templates/clients_table.html b/sheets/templates/clients_table.html new file mode 100644 index 0000000..85cbb1c --- /dev/null +++ b/sheets/templates/clients_table.html @@ -0,0 +1,282 @@ + + + + + Clients Table + + + + + + + + ← Back to Main + +
+

Clients Table

+ + + + + + + + + + + + + {% for client in clients %} + + + + + + + + {% endfor %} + +
# IDNameAddressActions
{{ forloop.counter }} {{ client.id }}{{ client.name }}{{ client.address }} + + +
+
+ + + + + + + +
+ + + + + + +
+ + + + + + diff --git a/sheets/templates/excel_table.html b/sheets/templates/table_one.html similarity index 83% rename from sheets/templates/excel_table.html rename to sheets/templates/table_one.html index 433a372..fb11bdc 100644 --- a/sheets/templates/excel_table.html +++ b/sheets/templates/table_one.html @@ -115,8 +115,16 @@ +
+ + + ⇦ Go to Clients + +
+

Excel-like Table

+
@@ -124,6 +132,7 @@ + @@ -135,38 +144,7 @@ {% for entry in entries_table1 %} - - - - - - - - {% endfor %} - -
# ID Name Age
{{ entry.id }}{{ entry.name }}{{ entry.age }}{{ entry.email }}{{ entry.date_joined }} - - -
-
- - -
- - - - - - - - - - - - - - {% for entry in entries_table2 %} - + @@ -215,14 +193,6 @@ currentModelName = 'ExcelEntry'; // Model name for Table 1 $('#add-popup').fadeIn(); }); - - // Open Add Popup for Table 2 - $('#add-row-2').on('click', function () { - currentTableId = 'table-2'; - currentModelName = 'SecondTableEntry'; // Model name for Table 2 - $('#add-popup').fadeIn(); - }); - // Close Popups $('.close-btn').on('click', function () { $('.popup').fadeOut(); @@ -244,8 +214,10 @@ 'csrfmiddlewaretoken': '{{ csrf_token }}' }, success: function (response) { + let rowCount = $(`#${currentTableId} tbody tr`).length + 1; let newRow = ` + @@ -269,9 +241,9 @@ currentTableId = row.closest('table').attr('id'); // Set current table ID currentModelName = currentTableId === 'table-1' ? 'ExcelEntry' : 'SecondTableEntry'; // Set model name $('#edit-id').val(row.data('id')); - $('#edit-name').val(row.find('td:eq(1)').text()); - $('#edit-age').val(row.find('td:eq(2)').text()); - $('#edit-email').val(row.find('td:eq(3)').text()); + $('#edit-name').val(row.find('td:eq(2)').text()); // Name is now in column 2 + $('#edit-age').val(row.find('td:eq(3)').text()); // Age is now in column 3 + $('#edit-email').val(row.find('td:eq(4)').text()); // Email is now in column 4 $('#edit-popup').fadeIn(); }); @@ -294,10 +266,10 @@ }, success: function (response) { if (response.status === 'success') { - let row = $(`tr[data-id="${id}"]`); - row.find('td:eq(1)').text(name); - row.find('td:eq(2)').text(age); - row.find('td:eq(3)').text(email); + let row = $(`tr[data-id="${response.id}"]`); + row.find('td:eq(2)').text(response.name); + row.find('td:eq(3)').text(response.age); + row.find('td:eq(4)').text(response.email); $('#edit-popup').fadeOut(); } else { alert('Failed to update entry: ' + response.message); diff --git a/sheets/templates/table_two.html b/sheets/templates/table_two.html new file mode 100644 index 0000000..3cb0190 --- /dev/null +++ b/sheets/templates/table_two.html @@ -0,0 +1,318 @@ + + + + + + Excel-like Table + + + + + + + + + +

Excel-like Table

+ + + + + +
+ +
IDNameAgeEmailDate JoinedActions
{{ forloop.counter }} {{ entry.id }} {{ entry.name }} {{ entry.age }}
${rowCount} ${response.id} ${response.name} ${response.age}
+ + + + + + + + + + + + + {% for entry in entries_table2 %} + + + + + + + + + + {% endfor %} + +
#IDNameAgeEmailDate JoinedActions
{{ forloop.counter }}{{ entry.id }}{{ entry.name }}{{ entry.age }}{{ entry.email }}{{ entry.date_joined }} + + +
+
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/sheets/urls.py b/sheets/urls.py index c583839..17546bc 100644 --- a/sheets/urls.py +++ b/sheets/urls.py @@ -2,8 +2,10 @@ from django.urls import path from . import views urlpatterns = [ - path('', views.excel_table_view, name='excel_table'), + path('', views.clients_list, name='clients_list'), # Main page + path('table-one/', views.table_one_view, name='table_one'), # Table One + path('table-two/', views.table_two_view, name='table_two'), # Table Two path('add-entry//', views.add_entry, name='add_entry'), path('update-entry//', views.update_entry, name='update_entry'), path('delete-entry//', views.delete_entry, name='delete_entry'), -] \ No newline at end of file +] diff --git a/sheets/views.py b/sheets/views.py index b838c93..a4725db 100644 --- a/sheets/views.py +++ b/sheets/views.py @@ -2,30 +2,42 @@ from django.shortcuts import render from django.http import JsonResponse from django.apps import apps from datetime import date +from .models import Client -# View to render the table page -def excel_table_view(request): - # Fetch existing entries from both tables +# Clients Page (Now the homepage) +def clients_list(request): + clients = Client.objects.all().order_by('id') + return render(request, 'clients_table.html', {'clients': clients}) + +# Table One View (ExcelEntry) +def table_one_view(request): entries_table1 = apps.get_model('sheets', 'ExcelEntry').objects.all() - entries_table2 = apps.get_model('sheets', 'SecondTableEntry').objects.all() - return render(request, 'excel_table.html', { - 'entries_table1': entries_table1, - 'entries_table2': entries_table2, - }) + return render(request, 'table_one.html', {'entries_table1': entries_table1}) -# Generic view to add a new row to any table +# Table Two View (SecondTableEntry) +def table_two_view(request): + entries_table2 = apps.get_model('sheets', 'SecondTableEntry').objects.all() + return render(request, 'table_two.html', {'entries_table2': entries_table2}) + +# Add Entry (Generic for all models) def add_entry(request, model_name): if request.method == 'POST': try: - # Dynamically get the model model = apps.get_model('sheets', model_name) - - # Get data from the request name = request.POST.get('name', 'New Name') + + if model_name.lower() == 'client': + address = request.POST.get('address', '') + entry = model.objects.create(name=name, address=address) + return JsonResponse({ + 'id': entry.id, + 'name': entry.name, + 'address': entry.address, + }) + age = int(request.POST.get('age', 0)) email = request.POST.get('email', 'example@email.com') - # Create a new entry entry = model.objects.create( name=name, age=age, @@ -33,7 +45,6 @@ def add_entry(request, model_name): date_joined=date.today() ) - # Return the new entry as JSON response return JsonResponse({ 'id': entry.id, 'name': entry.name, @@ -47,29 +58,35 @@ def add_entry(request, model_name): return JsonResponse({'status': 'error', 'message': 'Invalid request'}, status=400) -# Generic view to update an entry in any table +# Update Entry (Generic for all models) def update_entry(request, model_name): if request.method == 'POST': try: - # Dynamically get the model model = apps.get_model('sheets', model_name) - - # Get data from the request entry_id = int(request.POST.get('id')) + entry = model.objects.get(id=entry_id) name = request.POST.get('name') + + if model_name.lower() == 'client': + address = request.POST.get('address', '') + entry.name = name + entry.address = address + entry.save() + return JsonResponse({ + 'status': 'success', + 'id': entry.id, + 'name': entry.name, + 'address': entry.address, + }) + age = int(request.POST.get('age')) email = request.POST.get('email') - # Fetch the entry to be updated - entry = model.objects.get(id=entry_id) - - # Update the entry with new data entry.name = name entry.age = age entry.email = email entry.save() - # Return the updated entry as a JSON response return JsonResponse({ 'status': 'success', 'id': entry.id, @@ -86,21 +103,14 @@ def update_entry(request, model_name): return JsonResponse({'status': 'error', 'message': 'Invalid request'}, status=400) -# Generic view to delete an entry from any table +# Delete Entry (Generic for all models) def delete_entry(request, model_name): if request.method == 'POST': try: - # Dynamically get the model model = apps.get_model('sheets', model_name) - - # Get the entry ID from the request entry_id = request.POST.get('id') - - # Find the entry by its ID and delete it entry = model.objects.get(id=entry_id) entry.delete() - - # Return success response return JsonResponse({'status': 'success', 'message': 'Entry deleted'}) except model.DoesNotExist: @@ -108,4 +118,4 @@ def delete_entry(request, model_name): except Exception as e: return JsonResponse({'status': 'error', 'message': str(e)}, status=400) - return JsonResponse({'status': 'error', 'message': 'Invalid request'}, status=400) \ No newline at end of file + return JsonResponse({'status': 'error', 'message': 'Invalid request'}, status=400) diff --git a/temperature_data.db b/temperature_data.db new file mode 100644 index 0000000..5892f95 Binary files /dev/null and b/temperature_data.db differ