diff --git a/core/core/settings.py b/core/core/settings.py index 6186032..80e2e3a 100644 --- a/core/core/settings.py +++ b/core/core/settings.py @@ -141,8 +141,7 @@ else: 'USER': os.getenv('DB_USER', 'system3'), 'PASSWORD': os.getenv('DB_PASSWORD', 'system3'), 'OPTIONS': { - 'charset': 'utf8mb4', - 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'" + 'charset': 'utf8mb4' } } } diff --git a/core/inventory/serializers.py b/core/inventory/serializers.py index fc5d929..4aef119 100644 --- a/core/inventory/serializers.py +++ b/core/inventory/serializers.py @@ -1,49 +1,25 @@ from django.utils import timezone from rest_framework import serializers -from rest_framework.relations import SlugRelatedField from files.models import File from inventory.models import Event, Container, Item from mail.models import EventAddress -#class EventAdressSerializer(serializers.ModelSerializer): -# class Meta: -# model = EventAddress -# fields = ['address'] - -# def to_internal_value(self, data): -# if not isinstance(data, str): -# raise serializers.ValidationError('This field must be a string.') -# -# def create(self, validated_data): -# return EventAddress.objects.create(**validated_data) -# -# def validate(self, data): -# return isinstance(data, str) - +class EventAdressSerializer(serializers.ModelSerializer): + class Meta: + model = EventAddress + fields = ['address'] class EventSerializer(serializers.ModelSerializer): - #addresses = EventAdressSerializer(many=True, required=False) - addresses = SlugRelatedField(many=True, slug_field='address', queryset=EventAddress.objects.all()) + addresses = EventAdressSerializer(many=True, required=False) class Meta: model = Event fields = ['eid', 'slug', 'name', 'start', 'end', 'pre_start', 'post_end', 'addresses'] read_only_fields = ['eid'] -# def update(self, instance, validated_data): -# addresses = validated_data.pop('addresses', None) -# instance.save(validated_data) -# if addresses: -# for address in addresses: -# nested_instance, created = EventAddress.objects.get_or_create(address=address) -# instance.addresses.add(nested_instance) -# -# return instance - - class ContainerSerializer(serializers.ModelSerializer): itemCount = serializers.SerializerMethodField() diff --git a/core/inventory/tests/v2/test_events.py b/core/inventory/tests/v2/test_events.py index 6bbc701..affbd0e 100644 --- a/core/inventory/tests/v2/test_events.py +++ b/core/inventory/tests/v2/test_events.py @@ -47,18 +47,6 @@ class EventTestCase(TestCase): self.assertEqual(Event.objects.all()[0].slug, 'EVENT2') self.assertEqual(Event.objects.all()[0].name, 'Event 2 new') - def test_update_event(self): - from rest_framework.test import APIClient - event = Event.objects.create(slug='EVENT1', name='Event 1') - response = APIClient().patch(f'/api/2/events/{event.eid}/', {'addresses': ['foo@bar.baz', 'foo1@bar.baz']}) - self.assertEqual(response.status_code, 200) - self.assertEqual(response.json()['slug'], 'EVENT1') - self.assertEqual(response.json()['name'], 'Event 1') - self.assertEqual(len(Event.objects.all()), 1) - self.assertEqual(Event.objects.all()[0].slug, 'EVENT1') - self.assertEqual(Event.objects.all()[0].name, 'Event 1') - self.assertEqual(1, len(response.json()[0]['addresses'])) - def test_remove_event(self): event = Event.objects.create(slug='EVENT1', name='Event 1') Event.objects.create(slug='EVENT2', name='Event 2') @@ -77,3 +65,4 @@ class EventTestCase(TestCase): self.assertEqual('TEST1', response.json()[0]['slug']) self.assertEqual('Event', response.json()[0]['name']) self.assertEqual(1, len(response.json()[0]['addresses'])) + diff --git a/core/mail/migrations/0006_alter_eventaddress_address.py b/core/mail/migrations/0006_alter_eventaddress_address.py deleted file mode 100644 index 5a03261..0000000 --- a/core/mail/migrations/0006_alter_eventaddress_address.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.7 on 2024-11-06 06:13 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('mail', '0005_alter_eventaddress_event'), - ] - - operations = [ - migrations.AlterField( - model_name='eventaddress', - name='address', - field=models.CharField(max_length=255, unique=True), - ), - ] diff --git a/core/mail/models.py b/core/mail/models.py index c5d3b38..21061b5 100644 --- a/core/mail/models.py +++ b/core/mail/models.py @@ -33,9 +33,12 @@ class Email(SoftDeleteModel): class EventAddress(models.Model): id = models.AutoField(primary_key=True) event = models.ForeignKey(Event, models.SET_NULL, null=True, related_name='addresses') - address = models.CharField(max_length=255, unique=True) + address = models.CharField(max_length=255) class EmailAttachment(AbstractFile): email = models.ForeignKey(Email, models.CASCADE, related_name='attachments', null=True) name = models.CharField(max_length=255) + + + diff --git a/deploy/dev/docker-compose.yml b/deploy/dev/docker-compose.yml index dff5ab3..95e8083 100644 --- a/deploy/dev/docker-compose.yml +++ b/deploy/dev/docker-compose.yml @@ -6,17 +6,11 @@ services: command: bash -c 'python manage.py migrate && python manage.py runserver 0.0.0.0:8000' environment: - HTTP_HOST=core - - DB_HOST=db - - DB_PORT=3306 - - DB_NAME=system3 - - DB_USER=system3 - - DB_PASSWORD=system3 + #- DATABASE_URL volumes: - ../../core:/code ports: - "8000:8000" - depends_on: - - db frontend: build: @@ -29,8 +23,6 @@ services: - ./vue.config.js:/web/vue.config.js ports: - "8080:8080" - depends_on: - - core db: image: mariadb @@ -38,11 +30,4 @@ services: MARIADB_RANDOM_ROOT_PASSWORD: true MARIADB_DATABASE: system3 MARIADB_USER: system3 - MARIADB_PASSWORD: system3 - volumes: - - mariadb_data:/var/lib/mysql - ports: - - "3306:3306" - -volumes: - mariadb_data: \ No newline at end of file + MARIADB_PASSWORD: system3 \ No newline at end of file diff --git a/web/src/components/CollapsableCards.vue b/web/src/components/CollapsableCards.vue index c91420d..554a960 100644 --- a/web/src/components/CollapsableCards.vue +++ b/web/src/components/CollapsableCards.vue @@ -73,15 +73,23 @@ export default { data() { return { collapsed: [], + symbols: ['▲', '▼', '▶', '◀'], }; }, created() { - const query = this.route ? (this.route.query ? this.route.query.collapsed : null) : null; + const query = this.$router.currentRoute ? (this.$router.currentRoute.query ? this.$router.currentRoute.query.collapsed : null) : null; if (query !== null && query !== undefined) { this.collapsed = this.unpackInt(parseInt(query), this.sections.length); } else { this.collapsed = this.sections.map(() => true); } + + //this.$router.push({...this.$router.currentRoute, query: {...this.$router.currentRoute.query, layout}}); + //this.collapsed = this.sections.map(() => true); + /*this.columns.map(e => ({ + k: e, + v: this.$store.getters.getFilters[e] + })).filter(e => e.v).forEach(e => this.setFilter(e.k, e.v));*/ }, computed: { grouped_items() { @@ -108,8 +116,8 @@ export default { const encoded = this.packInt(this.collapsed).toString() if (this.route.query.collapsed !== encoded) this.$router.push({ - ...this.route, - query: {...this.route.query, collapsed: encoded} + ...this.$router.currentRoute, + query: {...this.$router.currentRoute.query, collapsed: encoded} }); }, deep: true, diff --git a/web/src/components/ExpandableTable.vue b/web/src/components/ExpandableTable.vue deleted file mode 100644 index 6bd5175..0000000 --- a/web/src/components/ExpandableTable.vue +++ /dev/null @@ -1,124 +0,0 @@ - - - - - \ No newline at end of file diff --git a/web/src/store.js b/web/src/store.js index b29ffba..0724070 100644 --- a/web/src/store.js +++ b/web/src/store.js @@ -340,13 +340,6 @@ const store = createStore({ commit('replaceEvents', [...state.events.filter(e => e.eid !== event_id)]) } }, - async updateEvent({commit, dispatch, state}, {id, partial_event}){ - console.log(id, partial_event); - const {data, success} = await http.patch(`/2/events/${id}/`, partial_event, state.user.token); - if (success) { - commit('replaceEvents', [...state.events.filter(e => e.eid !== id), data]) - } - }, async fetchTicketStates({commit, state}) { if (!state.user.token) return; if (state.fetchedData.states > Date.now() - 1000 * 60 * 60 * 24) return; diff --git a/web/src/views/Ticket.vue b/web/src/views/Ticket.vue index cbb372c..63f3515 100644 --- a/web/src/views/Ticket.vue +++ b/web/src/views/Ticket.vue @@ -79,6 +79,16 @@ export default { shipping_voucher_type: null, } }, + watch: { + ticket(val) { + if (this.selected_state == null) { + this.selected_state = val.state; + } + if (this.selected_assignee == null) { + this.selected_assignee = val.assigned_to + } + } + }, computed: { ...mapState(['tickets', 'state_options', 'users']), ...mapGetters(['availableShippingVoucherTypes']), @@ -124,14 +134,12 @@ export default { }, }, mounted() { - this.scheduleAfterInit(() => [Promise.all([this.fetchTicketStates(), this.loadTickets(), this.loadUsers(), this.fetchShippingVouchers()]).then(()=>{ - this.selected_state = this.ticket.state; - this.selected_assignee = this.ticket.assigned_to - })]); + this.scheduleAfterInit(() => [this.fetchTicketStates(), this.loadTickets(), this.loadUsers(), + this.fetchShippingVouchers()]); } }; + \ No newline at end of file diff --git a/web/src/views/admin/Events.vue b/web/src/views/admin/Events.vue index e2ff952..1aab608 100644 --- a/web/src/views/admin/Events.vue +++ b/web/src/views/admin/Events.vue @@ -1,102 +1,50 @@ \ No newline at end of file