stash
This commit is contained in:
parent
999dc95b0b
commit
76dd805262
8 changed files with 72 additions and 28 deletions
|
@ -8,8 +8,8 @@ class IssueSerializer(serializers.ModelSerializer):
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = IssueThread
|
model = IssueThread
|
||||||
fields = ('id', 'timeline')
|
fields = ('id', 'timeline', 'name', 'state', 'assigned_to', 'last_activity')
|
||||||
read_only_fields = ('id', 'timeline')
|
read_only_fields = ('id', 'timeline', 'last_activity')
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_timeline(obj):
|
def get_timeline(obj):
|
||||||
|
|
|
@ -1,24 +0,0 @@
|
||||||
# Generated by Django 4.2.7 on 2023-12-06 03:34
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
import django.db.models.deletion
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('tickets', '0001_initial'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='comment',
|
|
||||||
name='issue_thread',
|
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='comments', to='tickets.issuethread'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='statechange',
|
|
||||||
name='issue_thread',
|
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='state_changes', to='tickets.issuethread'),
|
|
||||||
),
|
|
||||||
]
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
# Generated by Django 4.2.7 on 2023-12-06 03:53
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('tickets', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='issuethread',
|
||||||
|
name='assigned_to',
|
||||||
|
field=models.CharField(max_length=255, null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='issuethread',
|
||||||
|
name='last_activity',
|
||||||
|
field=models.DateTimeField(auto_now=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='issuethread',
|
||||||
|
name='name',
|
||||||
|
field=models.CharField(default='unnamed issue', max_length=255),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='issuethread',
|
||||||
|
name='state',
|
||||||
|
field=models.CharField(default='new', max_length=255),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='comment',
|
||||||
|
name='issue_thread',
|
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='comments', to='tickets.issuethread'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='statechange',
|
||||||
|
name='issue_thread',
|
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='state_changes', to='tickets.issuethread'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -6,6 +6,10 @@ from inventory.models import Event
|
||||||
|
|
||||||
class IssueThread(SoftDeleteModel):
|
class IssueThread(SoftDeleteModel):
|
||||||
id = models.AutoField(primary_key=True)
|
id = models.AutoField(primary_key=True)
|
||||||
|
name = models.CharField(max_length=255)
|
||||||
|
state = models.CharField(max_length=255, default='new')
|
||||||
|
assigned_to = models.CharField(max_length=255, null=True)
|
||||||
|
last_activity = models.DateTimeField(auto_now=True)
|
||||||
|
|
||||||
|
|
||||||
class Comment(models.Model):
|
class Comment(models.Model):
|
||||||
|
|
|
@ -50,6 +50,10 @@ class IssueApiTest(TestCase):
|
||||||
self.assertEqual(response.status_code, 200)
|
self.assertEqual(response.status_code, 200)
|
||||||
self.assertEqual(len(response.json()), 1)
|
self.assertEqual(len(response.json()), 1)
|
||||||
self.assertEqual(response.json()[0]['id'], issue.id)
|
self.assertEqual(response.json()[0]['id'], issue.id)
|
||||||
|
self.assertEqual(response.json()[0]['name'], issue.name)
|
||||||
|
self.assertEqual(response.json()[0]['state'], issue.state)
|
||||||
|
self.assertEqual(response.json()[0]['assigned_to'], issue.assigned_to)
|
||||||
|
self.assertEqual(response.json()[0]['last_activity'], issue.last_activity.strftime('%Y-%m-%dT%H:%M:%S.%fZ'))
|
||||||
self.assertEqual(len(response.json()[0]['timeline']), 4)
|
self.assertEqual(len(response.json()[0]['timeline']), 4)
|
||||||
self.assertEqual(response.json()[0]['timeline'][0]['type'], 'mail')
|
self.assertEqual(response.json()[0]['timeline'][0]['type'], 'mail')
|
||||||
self.assertEqual(response.json()[0]['timeline'][1]['type'], 'state')
|
self.assertEqual(response.json()[0]['timeline'][1]['type'], 'state')
|
||||||
|
|
|
@ -112,7 +112,7 @@ export default {
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss" scoped>
|
||||||
@import "../scss/navbar.scss";
|
@import "../scss/navbar.scss";
|
||||||
|
|
||||||
.nav-tabs {
|
.nav-tabs {
|
||||||
|
@ -131,6 +131,7 @@ export default {
|
||||||
padding-bottom: 1rem !important;
|
padding-bottom: 1rem !important;
|
||||||
border: var(--gray) solid 1px !important;
|
border: var(--gray) solid 1px !important;
|
||||||
border-bottom: none !important;
|
border-bottom: none !important;
|
||||||
|
color: var(--blue) !important;
|
||||||
|
|
||||||
&.active {
|
&.active {
|
||||||
background: black !important;
|
background: black !important;
|
||||||
|
|
|
@ -123,6 +123,13 @@ const store = new Vuex.Store({
|
||||||
appendItem(state, item) {
|
appendItem(state, item) {
|
||||||
state.loadedItems.push(item);
|
state.loadedItems.push(item);
|
||||||
},
|
},
|
||||||
|
replaceTickets(state, tickets) {
|
||||||
|
state.tickets = tickets;
|
||||||
|
},
|
||||||
|
updateTicket(state, updatedTicket) {
|
||||||
|
const ticket = state.tickets.filter(({id}) => id === updatedTicket.id)[0];
|
||||||
|
Object.assign(ticket, updatedTicket);
|
||||||
|
},
|
||||||
createToast(state, {title, message, color}) {
|
createToast(state, {title, message, color}) {
|
||||||
var toast = {title, message, color, key: state.keyIncrement}
|
var toast = {title, message, color, key: state.keyIncrement}
|
||||||
state.toasts.push(toast);
|
state.toasts.push(toast);
|
||||||
|
@ -179,7 +186,11 @@ const store = new Vuex.Store({
|
||||||
commit('updateLastUsed', {box: item.box, cid: item.cid});
|
commit('updateLastUsed', {box: item.box, cid: item.cid});
|
||||||
const {data} = await axios.post(`/1/${getters.getEventSlug}/item`, item);
|
const {data} = await axios.post(`/1/${getters.getEventSlug}/item`, item);
|
||||||
commit('appendItem', data);
|
commit('appendItem', data);
|
||||||
}
|
},
|
||||||
|
async loadTickets({commit}) {
|
||||||
|
const {data} = await axios.get('/2/tickets/');
|
||||||
|
commit('replaceTickets', data);
|
||||||
|
},
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,9 @@ export default {
|
||||||
gotoDetail(ticket) {
|
gotoDetail(ticket) {
|
||||||
this.$router.push({name: 'ticket', params: {id: ticket.id}});
|
this.$router.push({name: 'ticket', params: {id: ticket.id}});
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.$store.dispatch('loadTickets');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
Loading…
Reference in a new issue