Skip to content

Commit

Permalink
Merge pull request #121 from gm3dmo/v2
Browse files Browse the repository at this point in the history
Adding more models
  • Loading branch information
gm3dmo authored Dec 8, 2023
2 parents b694f8c + 63ea316 commit 6a7c4c2
Show file tree
Hide file tree
Showing 17 changed files with 227 additions and 95 deletions.
133 changes: 89 additions & 44 deletions cmp/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,16 @@ def __str__(self):
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)
rank_types = (('OR','Other Rank'),('NC','Non Commisioned Officer'),('OF','Officer'))
abbreviation = models.CharField(max_length=50, blank=True)
rank_class = models.CharField(max_length=2, blank=True, choices=rank_types,default='Other Rank')

def __str__(self):
return self.name

class Cemetery(models.Model):
# 1
name = models.CharField(max_length=255, unique=True, default='')
Expand All @@ -41,57 +51,46 @@ class Cemetery(models.Model):
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 Company(models.Model):
# 2
class PowCamp(models.Model):
name = models.CharField(max_length=255, unique=True, default='')
nearest_city = models.CharField(max_length=255, unique=False, default='')
notes = models.CharField(max_length=255, unique=False, default='')
country = models.ForeignKey('Country', to_field='country_number', on_delete=models.CASCADE, related_name='powcamps')
wartime_country = models.CharField(max_length=255, unique=False, default='')
latitude = models.CharField(max_length=255, unique=False, default='')
longitude = models.CharField(max_length=255, unique=False, default='')

def __str__(self):
return self.name

class Rank(models.Model):
name = models.CharField(max_length=50, unique=True)
rank_types = (('OR','Other Rank'),('NC','Non Commisioned Officer'),('OF','Officer'))
abbreviation = models.CharField(max_length=50, blank=True)
rank_class = models.CharField(max_length=2, blank=True, choices=rank_types,default='Other Rank')

class Theatre(models.Model):
# 11
name = models.CharField(max_length=255, unique=True, default='')
def __str__(self):
return self.name


class PowCamp(models.Model):
class Company(models.Model):
# 2
name = models.CharField(max_length=255, unique=True, default='')
nearest_city = models.CharField(max_length=255, unique=False, default='')
notes = models.CharField(max_length=255, unique=False, default='')
country = models.ForeignKey('Country', to_field='country_number', on_delete=models.CASCADE, related_name='powcamps')
wartime_country = models.CharField(max_length=255, unique=False, default='')
latitude = models.CharField(max_length=255, unique=False, default='')
longitude = models.CharField(max_length=255, unique=False, default='')

def __str__(self):
return self.name


class Theatre(models.Model):
# 11
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='')
Expand All @@ -103,18 +102,47 @@ def __str__(self):


class SoldierDeath(models.Model):
soldier = models.OneToOneField(Soldier, on_delete=models.CASCADE, primary_key=True)
date = models.DateField(null=True, blank=True)
company = models.ForeignKey(Company, blank=True, null=True, default="UNKNOWN", on_delete=models.CASCADE)
cemetery = models.ForeignKey(Cemetery, blank=True, null=True, default=110, 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=False, verbose_name="War Graves ID")

def __str__(self):
return f"{self.soldier} {self.date} {self.cemetery}"
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='')
Expand All @@ -127,9 +155,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='')
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.decoration.name

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
2 changes: 2 additions & 0 deletions cmp/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,5 +30,7 @@
path("mgmt/soldiers", views.edit_soldiers, name="soldiers"),
path("mgmt/soldiers/<int:soldier_id>/", views.detail_soldiers, name="soldiers"),
path("mgmt/soldiers/edit/<int:soldier_id>", views.edit_soldiers, name="edit-soldiers"),

path('soldier/<int:soldier_id>/', views.soldier, name='soldier'),

]
19 changes: 19 additions & 0 deletions cmp/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -310,3 +310,22 @@ def edit_ranks(request):
form.save()
return HttpResponse("Rank Added")
return render(request, "cmp/edit-ranks.html", {"form": form})


def soldier(request, soldier_id):
# get or return a 404
soldier = get_object_or_404(Soldier, pk=soldier_id)
return render(request, "cmp/soldier.html", {"soldier": soldier})


#def soldier_detail(request, soldier_id):
# """Gather together details about soldier"""
# s = Soldier.objects.get(id=soldier_id)
# soldier_record = {
# 's_surname': s.surname,
# #'s_initials': s.dot_initials(),
# 's_rank': s.rank,
# 's_armynumber': s.army_number,
# 's_notes': s.notes,
# }
# return soldier_record
3 changes: 3 additions & 0 deletions insertall.sh
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
python manage.py runscript insert-all-countries
python manage.py runscript add-flags-to-countries.py
#python manage.py runscript insert-all-theatres
python manage.py runscript insert-all-cemeteries
python manage.py runscript insert-all-pow-camps
python manage.py runscript insert-all-ranks
Expand All @@ -7,3 +9,4 @@ python manage.py runscript insert-all-companies
python manage.py runscript insert-all-soldiers
python manage.py runscript insert-all-soldier-imprisonments
python manage.py runscript insert-all-soldier-deaths
python manage.py runscript insert-all-soldier-decorations
4 changes: 2 additions & 2 deletions scripts/delete-all-soldier-deaths.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from cmp.models import SoldierDeath

def run():
soldierDeaths = SoldierDeath.objects.all()
soldierDeaths.delete()
SoldierDeaths = SoldierDeath.objects.all()
SoldierDeaths.delete()
5 changes: 5 additions & 0 deletions scripts/delete-all-soldier-decorations.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from cmp.models import SoldierDecoration

def run():
SoldierDecorations = SoldierDecoration.objects.all()
SoldierDecorations.delete()
23 changes: 2 additions & 21 deletions scripts/insert-all-cemeteries.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,36 +14,17 @@ def run():
ref_data_url = "https://raw.githubusercontent.com/gm3dmo/old-cmp/main/data/cemetery.csv"
http = urllib3.PoolManager()
r = http.request('GET', ref_data_url)
print(r.status)
print(f"""Fetch table response code: {r.status}""")
# load the response into a csv dictionary reader
reader = csv.DictReader(r.data.decode('utf-8').splitlines())
reader.fieldnames = [field.replace('.', '_') for field in reader.fieldnames]

# add a country model for each row in the csv file
for row in reader:
print(row['id'])
if row['latitude'] == '':
row['latitude'] = 0
if row['longitude'] == '':
row['longitude'] = 0
if int(row['id']) == 948:
print(row)
continue
if int(row['id']) == 991:
print(row)
continue
if int(row['id']) == 1007:
print(row)
continue
if int(row['id']) == 1043:
print(row)
continue
if int(row['id']) == 1051:
print(row)
continue
if int(row['id']) == 1068:
print(row)
continue
try:
Cemetery.objects.create(
id=row['id'],
Expand All @@ -53,5 +34,5 @@ def run():
longitude=row['longitude']
)
except Exception as e:
print("Error with: " + row['name'])
print(f"""💥row: ({row}) """)
raise e
6 changes: 3 additions & 3 deletions scripts/insert-all-companies.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,18 +14,18 @@ def run():
ref_data_url = "https://raw.githubusercontent.com/gm3dmo/old-cmp/main/data/company.csv"
http = urllib3.PoolManager()
r = http.request('GET', ref_data_url)
print(r.status)
print(f"""Fetch table response code: {r.status}""")
# load the response into a csv dictionary reader
reader = csv.DictReader(r.data.decode('utf-8').splitlines())

print(reader.fieldnames)
for row in reader:
print(row['name'])
#print(row['name'])
try:
Company.objects.create(
name = row['name']
)
except Exception as e:
print("Error with: " + row['name'])
print(f"""💥row: ({row}) """)
raise e

2 changes: 1 addition & 1 deletion scripts/insert-all-countries.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ def run():
ref_data_url = "https://raw.githubusercontent.com/gm3dmo/old-cmp/main/data/country.csv"
http = urllib3.PoolManager()
r = http.request('GET', ref_data_url)
print(r.status)
print(f"""Fetch table response code: {r.status}""")
# load the response into a csv dictionary reader
reader = csv.DictReader(r.data.decode('utf-8').splitlines())
#reader.fieldnames = [field.replace('.', '_') for field in reader.fieldnames]
Expand Down
4 changes: 2 additions & 2 deletions scripts/insert-all-decorations.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,13 @@ def run():
ref_data_url = "https://raw.githubusercontent.com/gm3dmo/old-cmp/main/data/decoration.csv"
http = urllib3.PoolManager()
r = http.request('GET', ref_data_url)
print(r.status)
print(f"""Fetch table response code: {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['id'])
#print(row['id'])
try:
Decoration.objects.create(
id=row['id'],
Expand Down
7 changes: 4 additions & 3 deletions scripts/insert-all-pow-camps.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,14 @@ def run():
ref_data_url = "https://raw.githubusercontent.com/gm3dmo/old-cmp/main/data/pow-camp.csv"
http = urllib3.PoolManager()
r = http.request('GET', ref_data_url)
print(r.status)
print(f"""Fetch table response code: {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(f""" {row['id']} {row['Name']} ({row['PresentCountry_id']}) {row['WartimeCountry']} {row['Latitude']} {row['Longitude']}""")
#print(f""" {row['id']} {row['Name']} ({row['PresentCountry_id']}) {row['WartimeCountry']} {row['Latitude']} {row['Longitude']}""")
try:
PowCamp.objects.create(
id=row['id'],
Expand All @@ -32,6 +33,6 @@ def run():
longitude=row['Longitude']
)
except Exception as e:
print("Error with: " + row['Name'])
print(f"""💥row: ({row}) """)
raise e

10 changes: 3 additions & 7 deletions scripts/insert-all-ranks.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,13 @@ def run():
ref_data_url = "https://raw.githubusercontent.com/gm3dmo/old-cmp/main/data/rank.csv"
http = urllib3.PoolManager()
r = http.request('GET', ref_data_url)
print(r.status)
print(f"""Fetch table response code: {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'])
#print(row['name'])
try:
Rank.objects.create(
id=row['id'],
Expand All @@ -29,9 +29,5 @@ def run():
rank_class=row['class']
)
except Exception as e:
print("Error with: " + row['name'])
print(f"""💥row: ({row}) """)
raise e

for rank in Rank.objects.all():
print(f"""{rank.id} {rank.name}""")

Loading

0 comments on commit 6a7c4c2

Please sign in to comment.