models.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. # Copyright: (c) OpenSpug Organization. https://github.com/openspug/spug
  2. # Copyright: (c) <spug.dev@gmail.com>
  3. # Released under the AGPL-3.0 License.
  4. from django.db import models
  5. from django.conf import settings
  6. from libs import ModelMixin, human_datetime
  7. from apps.account.models import User
  8. from apps.app.models import Deploy
  9. from apps.repository.models import Repository
  10. import json
  11. import os
  12. class DeployRequest(models.Model, ModelMixin):
  13. STATUS = (
  14. ('-3', '发布异常'),
  15. ('-1', '已驳回'),
  16. ('0', '待审核'),
  17. ('1', '待发布'),
  18. ('2', '发布中'),
  19. ('3', '发布成功'),
  20. )
  21. TYPES = (
  22. ('1', '正常发布'),
  23. ('2', '回滚'),
  24. ('3', '自动发布'),
  25. )
  26. deploy = models.ForeignKey(Deploy, on_delete=models.CASCADE)
  27. repository = models.ForeignKey(Repository, null=True, on_delete=models.SET_NULL)
  28. name = models.CharField(max_length=50)
  29. type = models.CharField(max_length=2, choices=TYPES, default='1')
  30. extra = models.TextField()
  31. host_ids = models.TextField()
  32. desc = models.CharField(max_length=255, null=True)
  33. status = models.CharField(max_length=2, choices=STATUS)
  34. reason = models.CharField(max_length=255, null=True)
  35. version = models.CharField(max_length=50, null=True)
  36. spug_version = models.CharField(max_length=50, null=True)
  37. plan = models.DateTimeField(null=True)
  38. created_at = models.CharField(max_length=20, default=human_datetime)
  39. created_by = models.ForeignKey(User, models.PROTECT, related_name='+')
  40. approve_at = models.CharField(max_length=20, null=True)
  41. approve_by = models.ForeignKey(User, models.PROTECT, related_name='+', null=True)
  42. do_at = models.CharField(max_length=20, null=True)
  43. do_by = models.ForeignKey(User, models.PROTECT, related_name='+', null=True)
  44. @property
  45. def is_quick_deploy(self):
  46. if self.type == '1' and self.deploy.extend == '1' and self.extra:
  47. extra = json.loads(self.extra)
  48. return extra[0] in ('branch', 'tag')
  49. return False
  50. def delete(self, using=None, keep_parents=False):
  51. super().delete(using, keep_parents)
  52. if self.repository_id:
  53. if not DeployRequest.objects.filter(repository=self.repository).exists():
  54. self.repository.delete()
  55. if self.deploy.extend == '2':
  56. try:
  57. os.remove(os.path.join(settings.REPOS_DIR, str(self.deploy_id), self.spug_version))
  58. except FileNotFoundError:
  59. pass
  60. def __repr__(self):
  61. return f'<DeployRequest name={self.name}>'
  62. class Meta:
  63. db_table = 'deploy_requests'
  64. ordering = ('-id',)