From f8da0c8bfc580ea65d59023a827db9face7fc3c5 Mon Sep 17 00:00:00 2001 From: David Morris Date: Wed, 15 Nov 2023 08:41:47 +0000 Subject: [PATCH] Addin the last 3 models --- cmp/models.py | 160 +++++++++++++++------- insertall.sh | 3 + scripts/delete-all-soldier-deaths.py | 5 + scripts/delete-all-soldier-decorations.py | 5 + scripts/delete-all-theatres.py | 5 + scripts/insert-all-soldier-decorations.py | 37 +++++ scripts/insert-all-theatres.py | 35 +++++ 7 files changed, 198 insertions(+), 52 deletions(-) create mode 100644 scripts/delete-all-soldier-deaths.py create mode 100644 scripts/delete-all-soldier-decorations.py create mode 100644 scripts/delete-all-theatres.py create mode 100644 scripts/insert-all-soldier-decorations.py create mode 100644 scripts/insert-all-theatres.py diff --git a/cmp/models.py b/cmp/models.py index 4cff572..ba3634a 100644 --- a/cmp/models.py +++ b/cmp/models.py @@ -17,6 +17,20 @@ class CustomUser(AbstractUser): def __str__(self): return self.email +class Country(models.Model): + # 3 + name = models.CharField(max_length=255, unique=True, default='') + alpha2 = models.CharField(max_length=2, unique=True, default='') + alpha3 = models.CharField(max_length=3, unique=True, default='') + country_number = models.CharField(max_length=3, unique=True) + flag = models.CharField(max_length=255, default='') + + def __str__(self): + return self.name + + def get_absolute_url(self): + return reverse('countries', args=[str(self.id)]) + class Rank(models.Model): # 6 name = models.CharField(max_length=50, unique=True) @@ -27,6 +41,15 @@ class Rank(models.Model): def __str__(self): return self.name +class Cemetery(models.Model): + # 1 + name = models.CharField(max_length=255, unique=True, default='') + country = models.ForeignKey('Country', on_delete=models.CASCADE, related_name='cemeteries') + latitude = models.CharField(max_length=255, unique=False, default='') # latitude + longitude = models.CharField(max_length=255, unique=False, default='') # longitude + + def __str__(self): + return self.name class PowCamp(models.Model): name = models.CharField(max_length=255, unique=True, default='') @@ -47,8 +70,27 @@ class Theatre(models.Model): def __str__(self): return self.name +class Company(models.Model): + # 2 + name = models.CharField(max_length=255, unique=True, default='') + notes = models.CharField(max_length=255, unique=False, default='') + + def __str__(self): + return self.name + +class Decoration(models.Model): + # 4 + name = models.CharField(max_length=255, unique=True, default='') + notes = models.CharField(max_length=255, unique=False, default='') + country = models.ForeignKey('Country', on_delete=models.CASCADE) + details_link = models.CharField(max_length=255, unique=False, default='') + abbreviation = models.CharField(max_length=255, unique=False, default='') + + def __str__(self): + return self.Name + + class Soldier(models.Model): - # 10 surname = models.CharField(max_length=255, unique=False, default='') initials = models.CharField(max_length=255, unique=False, default='') army_number = models.CharField(max_length=255, unique=False, default='') @@ -58,8 +100,50 @@ class Soldier(models.Model): def __str__(self): return self.surname + +class SoldierDeath(models.Model): + soldier = models.ForeignKey('Soldier', on_delete=models.CASCADE) + #soldier = models.OneToOneField(Soldier, on_delete=models.CASCADE, related_name='soldierdeath') + date = models.DateField(null=True, blank=True) + company = models.ForeignKey(Company, blank=True, null=True, default="UNKNOWN", on_delete=models.CASCADE, related_name='companies') + cemetery = models.ForeignKey(Cemetery, blank=True, null=True, default=110, on_delete=models.CASCADE, related_name='cemeteries') + cwgc_id = models.IntegerField(blank=True, null=True, unique=True, verbose_name="War Graves ID") + def __unicode__(self): + return '%s %s %s' % (self.Soldier, self.Date, self.cemetery) + + def cwgc_url(self): + """Build a URL for a link to CWGC site.""" + wg_site = 'http://www.cwgc.org' + if self.cwgc_id: + wg_string = 'find-war-dead/casualty/%s/' % (self.cwgc_id) + wg_url = '%s/%s' % (wg_site, wg_string ) + return wg_url + else: + dk = self.Date + wg_string = 'search/SearchResults.aspx?surname=%s&initials=%s&war=0&yearfrom=%s&yearto=%s&force=%s&nationality=&send.x=26&send.y=19"' % (self.Soldier.Surname, self.Soldier.first_initial(), dk.year, dk.year, 'Army') + wg_url = '%s/%s' % (wg_site, wg_string ) + return wg_url + + def grave_photo(self): + photo_dir = '/sites/corpsofmilitarypolice.org/www/media/grave_images' + id_photo_dir = '/sites/corpsofmilitarypolice.org/www/media/grave_images/soldier_id' + """Determine whether or not a photograph exists + for a soldier with a particular army number""" + army_number = self.Soldier.Army_number + modded_an = re.sub('\/','_',army_number,1) + photo_name = modded_an + ".jpg" + id_photo_name = str(self.Soldier.id) + ".jpg" + photo_file = '%s/%s' % (photo_dir, photo_name) + id_photo_file = '%s/%s' % (id_photo_dir, id_photo_name) + if os.path.isfile(photo_file): + return photo_name + elif os.path.isfile(id_photo_file): + return 'soldier_id/%s' % id_photo_name + else: + return None + + class SoldierImprisonment(models.Model): - # 9 soldier = models.ForeignKey('Soldier', on_delete=models.CASCADE) legacy_company = models.CharField(max_length=255, unique=False, default='') pow_number = models.CharField(max_length=255, unique=False, default='') @@ -72,54 +156,26 @@ class SoldierImprisonment(models.Model): class SoldierDecoration(models.Model): - # 8 - name = models.CharField(max_length=255, unique=True, default='') - notes = models.CharField(max_length=255, unique=False, default='') - country_id = models.ForeignKey('Country', on_delete=models.CASCADE) - details_link = models.CharField(max_length=255, unique=False, default='') - abbreviation = models.CharField(max_length=255, unique=False, default='') - -class Company(models.Model): - # 2 - name = models.CharField(max_length=255, unique=True, default='') - notes = models.CharField(max_length=255, unique=False, default='') - + soldier = models.ForeignKey(Soldier, null=False, blank=False, on_delete=models.CASCADE) + company = models.ForeignKey(Company, blank=True, null=True, on_delete=models.CASCADE ) + decoration = models.ForeignKey(Decoration, blank=True, null=True, on_delete=models.CASCADE) + gazette_issue = models.CharField(max_length=50, blank=True) + gazette_page = models.CharField(max_length=50, blank=True) + gazette_date = models.DateField(null=True, blank=True) + theatre = models.ForeignKey(Theatre, blank=True, null=True, help_text="Theatre of Operations e.g. Normandy, B.E.F. France & Flanders. NOT Country names", on_delete=models.CASCADE) + country = models.ForeignKey(Country, blank=True, null=True, on_delete=models.CASCADE) + citation = models.TextField(max_length=50000, blank=True) + notes = models.TextField(max_length=50000, blank=True) def __str__(self): - return self.name - - -class Cemetery(models.Model): - # 1 - name = models.CharField(max_length=255, unique=True, default='') - country = models.ForeignKey('Country', on_delete=models.CASCADE, related_name='cemeteries') - latitude = models.CharField(max_length=255, unique=False, default='') # latitude - longitude = models.CharField(max_length=255, unique=False, default='') # longitude - - def __str__(self): - return self.name - - -class Decoration(models.Model): - # 4 - name = models.CharField(max_length=255, unique=True, default='') - notes = models.CharField(max_length=255, unique=False, default='') - country = models.ForeignKey('Country', on_delete=models.CASCADE) - details_link = models.CharField(max_length=255, unique=False, default='') - abbreviation = models.CharField(max_length=255, unique=False, default='') - - def __str__(self): - return self.Name - -class Country(models.Model): - # 3 - name = models.CharField(max_length=255, unique=True, default='') - alpha2 = models.CharField(max_length=2, unique=True, default='') - alpha3 = models.CharField(max_length=3, unique=True, default='') - country_number = models.CharField(max_length=3, unique=True) - flag = models.CharField(max_length=255, default='') - - def __str__(self): - return self.name - - def get_absolute_url(self): - return reverse('countries', args=[str(self.id)]) \ No newline at end of file + return self.decoration + + def generate_gazette_url(self): + """Build a URL for the London Gazette website. This will not handle Edinburgh gazette""" + gz_site = 'http://www.thegazette.co.uk' + # "${gz_url}/SearchResults.aspx?GeoType=${gz_type}&st=${sc_type}&sb=issue&issue=${gz_issue}&gpn=${gz_page}&" + gz_type = 'london' + sc_type = 'adv' + #gz_string = "SearchResults.aspx?GeoType=${gz_type}&st=${sc_type}&sb=issue&issue=${gz_issue}&gpn=${gz_page}&" + gz_string = "%s/London/issue/%s/supplement/%s" % (gz_site, self.GztIssue, self.GztPage ) + gazette_url = gz_string + return gazette_url diff --git a/insertall.sh b/insertall.sh index 5f7c564..047bca7 100755 --- a/insertall.sh +++ b/insertall.sh @@ -4,5 +4,8 @@ python manage.py runscript insert-all-pow-camps python manage.py runscript insert-all-ranks python manage.py runscript insert-all-decorations python manage.py runscript insert-all-companies +python manage.py runscript insert-all-theatres python manage.py runscript insert-all-soldiers python manage.py runscript insert-all-soldier-imprisonments +# python manage.py runscript insert-all-soldier-decorations +# python manage.py runscript insert-all-soldier-deaths diff --git a/scripts/delete-all-soldier-deaths.py b/scripts/delete-all-soldier-deaths.py new file mode 100644 index 0000000..ee2ec85 --- /dev/null +++ b/scripts/delete-all-soldier-deaths.py @@ -0,0 +1,5 @@ +from cmp.models import SoldierDecoration + +def run(): + Decorations = SoldierDecoration.objects.all() + Decorations.delete() diff --git a/scripts/delete-all-soldier-decorations.py b/scripts/delete-all-soldier-decorations.py new file mode 100644 index 0000000..ee2ec85 --- /dev/null +++ b/scripts/delete-all-soldier-decorations.py @@ -0,0 +1,5 @@ +from cmp.models import SoldierDecoration + +def run(): + Decorations = SoldierDecoration.objects.all() + Decorations.delete() diff --git a/scripts/delete-all-theatres.py b/scripts/delete-all-theatres.py new file mode 100644 index 0000000..dfe1e17 --- /dev/null +++ b/scripts/delete-all-theatres.py @@ -0,0 +1,5 @@ +from cmp.models import Theatre + +def run(): + Theatres = Theatre.objects.all() + Theatres.delete() diff --git a/scripts/insert-all-soldier-decorations.py b/scripts/insert-all-soldier-decorations.py new file mode 100644 index 0000000..f3cf092 --- /dev/null +++ b/scripts/insert-all-soldier-decorations.py @@ -0,0 +1,37 @@ + +def run(): + + import sys + import urllib3 + import csv + from cmp.models import SoldierDecoration + + print() + title = sys.argv[2] + print(f"""\033[4;33m{title}\033[0m""") + print("-" * len(title)) + + ref_data_url = "https://raw.githubusercontent.com/gm3dmo/old-cmp/main/data/soldier-decoration.csv" + http = urllib3.PoolManager() + r = http.request('GET', ref_data_url) + print(r.status) + # load the response into a csv dictionary reader + reader = csv.DictReader(r.data.decode('ISO-8859-1').splitlines()) + # breakpoint() + print(reader) + # id,soldier_id,company_id,decoration_id,gazetteIssue,gazettePage,gazetteDate,citation,notes,country_id + for row in reader: + print(f"""SoldierDecoration: {row['id']} {row['soldier_id']} """) + try: + SoldierDecoration.objects.create( + id = row['id'], + name = row['name'], + notes = row['notes'], + country_id = row['country_id'], + details_link = row['details_link'], + abbreviation = row['abbreviation'] + ) + except Exception as e: + print("Error with: " + row['id']) + + raise e diff --git a/scripts/insert-all-theatres.py b/scripts/insert-all-theatres.py new file mode 100644 index 0000000..998c874 --- /dev/null +++ b/scripts/insert-all-theatres.py @@ -0,0 +1,35 @@ + +def run(): + + import sys + import urllib3 + import csv + from cmp.models import Theatre + + print() + title = sys.argv[2] + print(f"""\033[4;33m{title}\033[0m""") + print("-" * len(title)) + + ref_data_url = "https://raw.githubusercontent.com/gm3dmo/old-cmp/main/data/theatre.csv" + http = urllib3.PoolManager() + r = http.request('GET', ref_data_url) + print(r.status) + # load the response into a csv dictionary reader + reader = csv.DictReader(r.data.decode('utf-8').splitlines()) + + # add a country model for each row in the csv file + for row in reader: + print(row['Name']) + try: + Theatre.objects.create( + id=row['id'], + name=row['Name'] + ) + except Exception as e: + print("Error with: " + row['Name']) + raise e + + for theatre in Theatre.objects.all(): + print(f"""{theatre.id} {theatre.name}""") +