# This is an auto-generated Django model module.
# You'll have to do the following manually to clean this up:
#   * Rearrange models' order
#   * Make sure each model has one field with primary_key=True
#   * Make sure each ForeignKey and OneToOneField has `on_delete` set to the desired behavior
#   * Remove `managed = False` lines if you wish to allow Django to create, modify, and delete the table
# Feel free to rename the models, but don't rename db_table values or field names.
from django.db import models


class AlembicVersion(models.Model):
    version_num = models.TextField()

    class Meta:
        managed = False
        db_table = 'alembic_version'


class Field(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.TextField(blank=True, null=True)

    class Meta:
        db_table = 'field'

    def __str__(self): return self.name

    def dict(self):
        return {'id': self.id, 'name': self.name}


class FieldsPeople(models.Model):
    id = models.AutoField(primary_key=True)
    person = models.ForeignKey('Person', models.DO_NOTHING, blank=True, null=True)
    field = models.ForeignKey(Field, models.DO_NOTHING, blank=True, null=True)

    class Meta:
        db_table = 'fields_people'


class Method(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.TextField(blank=True, null=True)

    class Meta:
        db_table = 'method'

    def __str__(self): return self.name

    def dict(self):
        return {'id': self.id, 'name': self.name}


class MethodsPeople(models.Model):
    id = models.AutoField(primary_key=True)
    person = models.ForeignKey('Person', models.DO_NOTHING, blank=True, null=True)
    method = models.ForeignKey(Method, models.DO_NOTHING, blank=True, null=True)

    class Meta:
        db_table = 'methods_people'


class Language(models.Model):
    id = models.AutoField(primary_key=True)
    language = models.TextField(blank=True, null=True)

    def __str__(self):
        return self.language


class RangeType(models.Model):
    id = models.AutoField(primary_key=True)
    range_type = models.TextField(blank=True, null=True)

    def __str__(self):
        return self.range_type


class MountainRange(models.Model):
    MAP_UNIT_CHOICES = (
        ('Aggregated', 'Aggregated'),
        ('Basic', 'Basic'),
        ('No', 'No'),
    )
    id = models.AutoField(primary_key=True)
    source_id = models.IntegerField(blank=True, null=True)
    gmba_id = models.TextField(blank=True, null=True)
    name = models.TextField(blank=True, null=True)
    countries = models.TextField(blank=True, null=True)

    range_name_map = models.CharField(blank=True, null=True, max_length=128)
    #range_name_map = models.CharField(blank=True, null=True, unique=True, max_length=128)
    range_name = models.CharField(blank=True, null=True, max_length=128)
    range_name_ascii = models.CharField(blank=True, null=True, max_length=128)
    range_name_language = models.ForeignKey(Language, models.DO_NOTHING, blank=True, null=True, to_field='id')
    mother_range = models.ForeignKey("self", models.DO_NOTHING, blank=True, null=True, to_field='id')
    feature = models.ForeignKey(RangeType, models.DO_NOTHING, blank=True, null=True, to_field='id')
    map_unit = models.TextField(blank=True, null=True, choices=MAP_UNIT_CHOICES)
    level = models.TextField(blank=True, null=True)
    level_text = models.TextField(blank=True, null=True)
    level_1 = models.TextField(blank=True, null=True)
    level_2 = models.TextField(blank=True, null=True)
    level_3 = models.TextField(blank=True, null=True)
    latitude = models.CharField(blank=True, null=True, max_length=128)
    longitude = models.CharField(blank=True, null=True, max_length=128)
    orogeny = models.TextField(blank=True, null=True)
    area = models.FloatField(default=-1)
    GMBA_v1_id = models.CharField(blank=True, null=True, max_length=25)
    peak_elevation = models.TextField(blank=True, null=True)
    peak_name = models.TextField(blank=True, null=True)
    peak_latitude = models.TextField(blank=True, null=True)
    peak_longitude = models.TextField(blank=True, null=True)
    comments = models.TextField(blank=True, null=True)
    checked = models.BooleanField(default=False)
    source = models.TextField(blank=True, null=True)
    range_alternate_id = models.CharField(blank=True, null=True, max_length=128)
    geologic_region = models.TextField(blank=True, null=True)
    gmba_v2_id = models.PositiveIntegerField(blank=True, null=True)
    gmba_v2_id_str = models.TextField(blank=True, null=True)
    wiki_data_id = models.CharField(blank=True, null=True, max_length=25)
    wiki_data_url = models.URLField(blank=True, null=True)
    select_300 = models.BooleanField(default=False)
    gmba_narrow = models.BooleanField(default=False, verbose_name="GMBA Standard")
    name_fr = models.CharField(blank=True, null=True, max_length=128)
    name_de = models.CharField(blank=True, null=True, max_length=128)
    name_es = models.CharField(blank=True, null=True, max_length=128)
    name_pt = models.CharField(blank=True, null=True, max_length=128)
    name_cn = models.CharField(blank=True, null=True, max_length=128)
    name_ru = models.CharField(blank=True, null=True, max_length=128)
    name_tr = models.CharField(blank=True, null=True, max_length=128)
    perimeter = models.TextField(blank=True, null=True)
    color_all = models.TextField(blank=True, null=True)
    color_basic = models.TextField(blank=True, null=True)
    color_300 = models.TextField(blank=True, null=True)
    elev_low = models.TextField(blank=True, null=True)
    elev_high = models.TextField(blank=True, null=True)
    elev_range = models.TextField(blank=True, null=True)
    elev_avg = models.TextField(blank=True, null=True)

    class Meta:
        db_table = 'range'

    def __str__(self):
        return self.range_name if self and self.range_name else '--'

    def dict(self):
        return {
            'id': self.id,
            'name': self.range_name,
            'gmba_id': self.gmba_id,
            'countries': self.countries,
        }


class Resource(models.Model):
    STAR_CHOICES = (
        ("", ""),
        ("-", "-"),
        ("*", "*"),
        ("**", "**"),
        ("***", "***"),
        ("****", "****"),
        ("*****", "*****"),
    )
    TYPE_CHOICES = (
        ("", ""),
        ("Atlas", "Atlas"),
        ("Book", "Book"),
        ("Book chapter", "Book chapter"),
        ("Case study", "Case study"),
        ("Conservation project", "Conservation project"),
        ("Dataset", "Dataset"),
        ("Development project", "Development project"),
        ("Journal article", "Journal article"),
        ("LTER", "LTER"),
        ("Map", "Map"),
        ("Network", "Network"),
        ("PEGASuS", "PEGASuS"),
        ("Presentation", "Presentation"),
        ("Report", "Report"),
        ("Research project", "Research project"),
        ("Research Site", "Research Site"),
        ("Thesis", "Thesis"),
        ("Video", "Video"),
        ("Website", "Website"),
        ("Working Group", "Working Group"),
    )

    id = models.AutoField(primary_key=True)
    source_id = models.IntegerField(blank=True, null=True)
    title = models.TextField(blank=True, null=True)
    url = models.URLField(blank=True, null=True)
    citation = models.TextField(blank=True, null=True)
    abstract = models.TextField(blank=True, null=True)

    type = models.TextField(blank=True, null=True, choices=TYPE_CHOICES)
    author_keywords = models.TextField(blank=True, null=True)
    lat = models.CharField(blank=True, null=True, max_length=128)
    lon = models.CharField(blank=True, null=True, max_length=128)
    stars = models.TextField(blank=True, null=True, choices=STAR_CHOICES)
    PEGASuS_Check_map_with_author = models.BooleanField(default=False)
    PEGASuS_polygon_ID = models.CharField(max_length=32, blank=True, null=True)
    PEGASuS_Polygon_comments = models.TextField(blank=True, null=True)
    PEGASuS_Assessment_ID = models.CharField(max_length=32, blank=True, null=True)
    gloria = models.BooleanField(default=False)
    gnomo = models.BooleanField(default=False)
    lter = models.BooleanField(default=False)
    ltser = models.BooleanField(default=False)
    miren = models.BooleanField(default=False)
    team = models.BooleanField(default=False)
    inventory = models.BooleanField(default=False)
    doi = models.CharField(max_length=128, blank=True, null=True)
    wiki_data_id = models.CharField(max_length=128, blank=True, null=True)

    class Meta:
        db_table = 'resource'

    def __str__(self):
        return self.title

    def dict(self):
        return {
            'id': self.id,
            'title': self.title or '',
            'citation': self.citation or '',
            'url': self.url or '',
            'abstract': self.abstract or '',
        }


class Scale(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.TextField(blank=True, null=True)

    class Meta:
        db_table = 'scale'

    def __str__(self):
        return self.name


class Taxon(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.TextField(blank=True, null=True)

    class Meta:
        db_table = 'taxon'

    def __str__(self): return self.name

    def dict(self):
        return {'id': self.id, 'name': self.name}


# LU models
class Country(models.Model):
    id = models.AutoField(primary_key=True)
    short_name = models.TextField(blank=True, null=True)
    formal_name = models.TextField(blank=True, null=True)
    membership_within_un_system = models.TextField(blank=True, null=True)
    continent = models.TextField(blank=True, null=True)
    eu_ms = models.TextField(blank=True, null=True)
    eea_ms = models.TextField(blank=True, null=True)
    iso3 = models.TextField(blank=True, null=True)
    iso2 = models.TextField(blank=True, null=True)

    def __str__(self):
        return self.short_name if self else '--'


class GMBA_SpeciesGroup(models.Model):
    id = models.AutoField(primary_key=True)
    species_group = models.TextField(blank=True, null=True)

    def __str__(self):
        return self.species_group


class PeopleStatus(models.Model):
    id = models.AutoField(primary_key=True)
    status = models.TextField(blank=True, null=True)

    def __str__(self):
        return self.status


class RedListCategory(models.Model):
    id = models.AutoField(primary_key=True)
    red_list_category = models.TextField(blank=True, null=True)

    def __str__(self):
        return self.red_list_category


class TaxonStatus(models.Model):
    id = models.AutoField(primary_key=True)
    taxon_status = models.TextField(blank=True, null=True)

    def __str__(self):
        return self.taxon_status


class TaxonUnit(models.Model):
    id = models.AutoField(primary_key=True)
    taxon_unit = models.TextField(blank=True, null=True)

    def __str__(self):
        return self.taxon_unit


class TrendsQuality(models.Model):
    id = models.AutoField(primary_key=True)
    trend = models.TextField(blank=True, null=True)

    def __str__(self):
        return self.trend


class TrendsQuantity(models.Model):
    id = models.AutoField(primary_key=True)
    trend = models.TextField(blank=True, null=True)

    def __str__(self):
        return self.trend


class Source(models.Model):
    id = models.AutoField(primary_key=True)
    source = models.TextField(blank=True, null=True)

    def __str__(self):
        return self.source


class Repository(models.Model):
    id = models.AutoField(primary_key=True)
    repository_name = models.TextField(blank=True, null=True)
    repository_url = models.TextField(blank=True, null=True)

    def __str__(self):
        return '%s --- %s' % (self.repository_name, self.repository_url)


class GMBA_function(models.Model):
    id = models.AutoField(primary_key=True)
    gmba_function = models.TextField(blank=True, null=True)

    def __str__(self):
        return self.gmba_function


class Organisation(models.Model):
    CATEGORY_CHOICES = (
        ('Independent', 'Independent'),
        ('Public administration > Research Institution', 'Public administration > Research Institution'),
        ('Academia > University > Institute', 'Academia > University > Institute'),
        ('Academia > University', 'Academia > University'),
        ('Public administration > Other Agency', 'Public administration > Other Agency'),
        ('Private > NGO (not for profit)', 'Private > NGO (not for profit)'),
        ('Academia > Academy of Sciences', 'Academia > Academy of Sciences'),
        ('Academia > Academy of Sciences > Institute', 'Academia > Academy of Sciences > Institute'),
        ('Public administration > Government', 'Public administration > Government'),
        ('Intergovernmental Agency > Research Institution', 'Intergovernmental Agency > Research Institution'),
        ('Intergovernmental Agency', 'Intergovernmental Agency '),
        ('Private > Research Institution', 'Private > Research Institution'),
        ('Collection > Museum', 'Collection > Museum'),
        ('Private > Business', 'Private > Business'),
        ('Education > Graduate', 'Education > Graduate'),
        ('Collection > Botanical Garden', 'Collection > Botanical Garden'),
        ('Other', 'Other'),)
    SUBJECT_CHOICES = (
        ('Other', 'Other'),
        ('Environment', 'Environment'),
        ('Ecology', 'Ecology'),
        ('Agriculture', 'Agriculture'),
        ('Botany', 'Botany'),
        ('Science and technology', 'Science and technology'),
        ('Biodiversity', 'Biodiversity'),
        ('Climate / Global Change', 'Climate / Global Change'),
        ('Mountains', 'Mountains'),
        ('Biology', 'Biology'),
        ('Forestry', 'Forestry'),
        ('Conservation', 'Conservation'),
        ('Culture / arts', 'Culture / arts'),
        ('Geography', 'Geography'),
        ('Zoology', 'Zoology'),
        ('Development / poverty / human rights', 'Development / poverty / human rights'),
        ('Social Sciences', 'Social Sciences'),
        ('Earth Sciences', 'Earth Sciences'),
        ('Health', 'Health'),
        ('Hydrology / Water', 'Hydrology / Water'),
        ('Sustainability', 'Sustainability'),
        ('Economy / finance', 'Economy / finance'),
        ('Natural Resources', 'Natural Resources'),
        ('Education', 'Education'),
        ('Architecture, planning & design', 'Architecture, planning & design'),
        ('', ''),
    )
    org_num1 = models.AutoField(primary_key=True, verbose_name='ID')
    organisation_search = models.TextField(blank=True, null=True)
    org_alpha_search = models.TextField(blank=True, null=True)
    organisation_english = models.CharField(max_length=256, blank=True, null=True, verbose_name='Organisation')
    organisation_2 = models.CharField(max_length=256, blank=True, null=True, verbose_name='Department 1')
    organisation_3 = models.CharField(max_length=256, blank=True, null=True, verbose_name='Department 2')
    organisation_original = models.TextField(blank=True, null=True)
    acronym = models.CharField(max_length=128, blank=True, null=True)
    street = models.CharField(max_length=256, blank=True, null=True)
    po_box = models.CharField(max_length=128, blank=True, null=True)
    postcode = models.CharField(max_length=64, blank=True, null=True)
    city = models.CharField(max_length=64, blank=True, null=True)
    region = models.TextField(blank=True, null=True)
    search_url = models.TextField(blank=True, null=True)
    lat_long = models.CharField(max_length=128, blank=True, null=True)
    url = models.URLField(blank=True, null=True)
    tel = models.CharField(max_length=128, blank=True, null=True)
    email = models.EmailField(blank=True, null=True)
    country = models.ForeignKey(Country, models.DO_NOTHING, blank=True, null=True, to_field='id')
    tags = models.TextField(blank=True, null=True)
    description = models.TextField(blank=True, null=True)
    northing = models.TextField(blank=True, null=True)
    easting = models.TextField(blank=True, null=True)
    category = models.TextField(blank=True, null=True, choices=CATEGORY_CHOICES)
    subject = models.CharField(max_length=128, blank=True, null=True, choices=SUBJECT_CHOICES)

    def __str__(self):
        if self.organisation_english:
            if self.organisation_2:
                name = f"{self.organisation_english} ({self.organisation_2})"
            else:
                name = f"{self.organisation_english}"
        else:
            name = '---'

        return name



class RangeOnlineInfo(models.Model):
    id = models.AutoField(primary_key=True)
    # This is supposed to be linked to MountainRange via range_name_map, but the range_name_map
    # is not itself unique. Are we missing something? TODO: Investigate
    #range_name = models.ForeignKey(MountainRange, models.DO_NOTHING, blank=True, null=True, to_field='range_name_map')
    #range_name = models.ForeignKey(MountainRange, blank=True, null=True, to_field='range_name_map', on_delete=models.CASCADE)
    range_name = models.TextField(blank=True, null=True)
    info_source = models.TextField(blank=True, null=True)
    url = models.TextField(blank=True, null=True)

    def __str__(self):
        return self.range_name


class RangeNameTranslation(models.Model):
    id = models.AutoField(primary_key=True)
    range_name = models.ForeignKey(MountainRange, models.DO_NOTHING, blank=True, null=True)
    language_translation = models.ForeignKey(Language, models.DO_NOTHING, blank=True, null=True)
    range_name_translation = models.TextField(blank=True, null=True)

    def __str__(self):
        return '%s - %s' % (self.range_name, self.language_translation.language)


class AddElevation(models.Model):
    id = models.AutoField(primary_key=True)
    gmba_v2_id = models.TextField(blank=True, null=True)
    elev_min = models.TextField(blank=True, null=True)
    elev_max = models.TextField(blank=True, null=True)
    elev_range = models.TextField(blank=True, null=True)

    def __str__(self):
        return '%s - %s' % (self.gmba_v2_id, self.elev_range)


class GMBA_V2_Centroid(models.Model):
    id = models.AutoField(primary_key=True)
    gridcode = models.TextField(blank=True, null=True)
    area = models.TextField(blank=True, null=True)
    latitude = models.TextField(blank=True, null=True)
    longitude = models.TextField(blank=True, null=True)

    def __str__(self):
        return '%s - %s, %s' % (self.gridcode, self.latitude, self.longitude)


class ImportGeom210915(models.Model):
    id = models.AutoField(primary_key=True)
    gmba_v2_id = models.TextField(blank=True, null=True)
    area = models.TextField(blank=True, null=True)
    perimeter = models.TextField(blank=True, null=True)
    color_all = models.TextField(blank=True, null=True)
    color_basic = models.TextField(blank=True, null=True)

    def __str__(self):
        return self.gmba_v2_id


class Keyword(models.Model):
    keyword_id = models.AutoField(primary_key=True)
    mother = models.ForeignKey("self", models.DO_NOTHING, blank=True, null=True, to_field='keyword_id',
                               related_name='mother_keyword')
    keyword = models.TextField(blank=True, null=True)

    def __str__(self):
        return '%s > %s' % (self.mother, self.keyword) if self.mother.keyword != '->' else self.keyword


class ResourceKeyword(models.Model):
    id = models.AutoField(primary_key=True)
    resource = models.ForeignKey(Resource, models.DO_NOTHING, blank=True, null=True)
    keyword = models.ForeignKey(Keyword, models.DO_NOTHING, blank=True, null=True, to_field='keyword_id')

    def __str__(self):
        return '%s - %s' % (self.resource.title, self.keyword.keyword)


class NamesImport(models.Model):
    id = models.AutoField(primary_key=True)
    gmba_v2_id = models.TextField(blank=True, null=True)
    cn = models.TextField(blank=True, null=True)
    de = models.TextField(blank=True, null=True)
    es = models.TextField(blank=True, null=True)
    fr = models.TextField(blank=True, null=True)
    pt = models.TextField(blank=True, null=True)
    ru = models.TextField(blank=True, null=True)
    tr = models.TextField(blank=True, null=True)

    def __str__(self):
        return '%s - %s - %s - %s' % (self.gmba_v2_id, self.cn, self.de, self.fr)


class ResourceRange(models.Model):
    id = models.AutoField(primary_key=True)
    resource_title = models.ForeignKey(Resource, models.DO_NOTHING, blank=True, null=True)
    range_name = models.ForeignKey(MountainRange, models.DO_NOTHING, blank=True, null=True)

    def __str__(self):
        return '%s,  %s' % (self.resource_title.title, self.range_name.name)


class LanguageLink(models.Model):
    id = models.AutoField(primary_key=True)
    language_number_code = models.ForeignKey(Language, models.DO_NOTHING, blank=True, null=True)
    language_letter_code = models.TextField(blank=True, null=True)

    def __str__(self):
        return '%s - %s' % (self.language_number_code.language, self.language_letter_code)


class Peak(models.Model):
    id = models.AutoField(primary_key=True)
    point_name = models.TextField(blank=True, null=True)
    latitude = models.TextField(blank=True, null=True)
    longitude = models.TextField(blank=True, null=True)
    type = models.TextField(blank=True, null=True)
    elevation = models.TextField(blank=True, null=True)
    link = models.TextField(blank=True, null=True)

    def __str__(self):
        return self.point_name


class Search(models.Model):
    id = models.AutoField(primary_key=True)
    range_name = models.ForeignKey(MountainRange, models.DO_NOTHING, blank=True, null=True)
    repository = models.ForeignKey(Repository, models.DO_NOTHING, blank=True, null=True)
    search_string = models.TextField(blank=True, null=True)
    search_date = models.TextField(blank=True, null=True)
    result = models.TextField(blank=True, null=True)
    number_of_records = models.TextField(blank=True, null=True)
    stored = models.TextField(blank=True, null=True)

    def __str__(self):
        return self.search_string if self else ' -- '


class Person(models.Model):
    MR_MRS_CHOICES = (
        ('', ''),
        ('Ms', 'Ms'),
        ('Mr', 'Mr'),
    )
    GMBA_FUNCTION_CHOICES = (
        ('', ''),
        ('Involved scientist', 'Involved scientist'),
        ('''Involved scientist
Steering committee''', '''Involved scientist
Steering committee'''),
         ('Network', 'Network'),
        ('Newsletter only', 'Newsletter only'),
        ('''Steering committee
Involved scientist''', '''Steering committee
Involved scientist''')
         )
    id = models.AutoField(primary_key=True)
    source_id = models.IntegerField(blank=True, null=True)
    title = models.CharField(blank=True, null=True, max_length=255)
    first_name = models.CharField(blank=True, null=True, max_length=50)
    last_name = models.CharField(blank=True, null=True, max_length=50)
    organisation = models.TextField(blank=True, null=True)
    position = models.CharField(blank=True, null=True, max_length=255)
    contact_email = models.EmailField(blank=True, null=True)  # email_1
    personal_url = models.URLField(blank=True, null=True)  # url ?
    biography = models.TextField(blank=True, null=True)
    field_indexer = models.TextField(db_column='_indexer', blank=True, null=True)  # Field renamed because it started with '_'.

    mr_mrs = models.TextField(blank=True, null=True, choices=MR_MRS_CHOICES)
    full_name = models.CharField(blank=True, null=True, max_length=100)
    search_name = models.CharField(blank=True, null=True, max_length=100)
    email_2 = models.EmailField(blank=True, null=True)
    skype = models.CharField(blank=True, null=True, max_length=50)
    professional_phone = models.CharField(blank=True, null=True, max_length=50)
    mobile_number = models.CharField(blank=True, null=True, max_length=50)
    url = models.URLField(blank=True, null=True)
    field_of_expertise = models.TextField(blank=True, null=True)
    status = models.ForeignKey(PeopleStatus, models.DO_NOTHING, blank=True, null=True, to_field='id')
    entry_date = models.TextField(blank=True, null=True)
    gmba_function = models.TextField(blank=True, null=True, choices=GMBA_FUNCTION_CHOICES)
    news_letter = models.BooleanField(default=False)
    country = models.ForeignKey(Country, models.DO_NOTHING, blank=True, null=True, to_field='id')
    organization = models.ForeignKey(Organisation, models.DO_NOTHING, blank=True, null=True)
    birds = models.BooleanField(default=False)
    mammals = models.BooleanField(default=False)
    reptiles = models.BooleanField(default=False)
    amphibians = models.BooleanField(default=False)
    fish = models.BooleanField(default=False)
    insects = models.BooleanField(default=False)
    molluscs = models.BooleanField(default=False)
    crustaceans = models.BooleanField(default=False)
    arachnids = models.BooleanField(default=False)
    angiosperms = models.BooleanField(default=False)
    gymnosperms = models.BooleanField(default=False)
    fungi = models.BooleanField(default=False)
    algae = models.BooleanField(default=False)
    microbes = models.BooleanField(default=False)
    biological_field_sampling = models.BooleanField(default=False)
    data_mining = models.BooleanField(default=False)
    remote_sensing = models.BooleanField(default=False)
    gis = models.BooleanField(default=False)
    spatial_analysis = models.BooleanField(default=False)
    statistical_analysis = models.BooleanField(default=False)
    modelling = models.BooleanField(default=False)
    assessment = models.BooleanField(default=False)
    meta_analysis = models.BooleanField(default=False)
    synthesis = models.BooleanField(default=False)
    qualitative_ssm = models.BooleanField(default=False)  #"Qualitative social science methods (interviews, surveys)"
    genetic_analyses = models.BooleanField(default=False)
    field_site = models.BooleanField(default=False)
    transect = models.BooleanField(default=False)
    mountain_top = models.BooleanField(default=False)
    mountain_range = models.BooleanField(default=False)
    landscape = models.BooleanField(default=False)
    regional = models.BooleanField(default=False)
    national = models.BooleanField(default=False)
    _global = models.BooleanField(default=False)
    geographic_area_of_expertise = models.TextField(blank=True, null=True)
    profile_on_web = models.BooleanField(default=False)
    updated = models.BooleanField(default=False)
    orcid = models.TextField(blank=True, null=True)
    web_of_science = models.TextField(blank=True, null=True)
    twitter = models.TextField(blank=True, null=True)
    instagram = models.TextField(blank=True, null=True)

    class Meta:
        db_table = 'person'

    def get_regional(self):
        return False

    def index(self):
        if self:
            self.field_indexer = " ".join([
                self.first_name if self and self.first_name else "",
                self.last_name if self and self.last_name else "",
                self.organisation if self and self.organisation else "",
                self.position if self and self.position else "",
                self.biography if self and self.biography else ""
            ] if self else "")
            self.save()
            return True
        else:
            return False

    def fullname(self):
        return " ".join([self.title if self.title else '',
                         self.first_name if self.first_name else '',
                         self.last_name if self.last_name else ''])

    def __str__(self):
        return self.fullname() if self.fullname() else ""

    def dict(self):
        return {
            'id': self.id,
            'fullname': self.fullname(),
            'organisation': self.organisation or '',
            'position': self.position or '',
            'country': self.country.short_name or '',
            'personal_url': self.personal_url or '',
            'personal_urls': [] if self.personal_url is None else self.personal_url.split(';'),
            'biography': self.biography or '',
        }


class TaxaPeople(models.Model):
    id = models.AutoField(primary_key=True)
    person = models.ForeignKey(Person, models.CASCADE, blank=True, null=True)
    taxon = models.ForeignKey('Taxon', models.DO_NOTHING, blank=True, null=True)

    class Meta:
        db_table = 'taxa_people'

    def __str__(self):
        return self.person.full_name


class RangesPeople(models.Model):
    id = models.AutoField(primary_key=True)
    person = models.ForeignKey(Person, models.CASCADE, blank=True, null=True)
    range = models.ForeignKey(MountainRange, models.DO_NOTHING, blank=True, null=True)

    class Meta:
        db_table = 'ranges_people'

    def __str__(self):
        return self.person.full_name


class ResourcesPeople(models.Model):
    id = models.AutoField(primary_key=True)
    person = models.ForeignKey(Person, models.CASCADE, blank=True, null=True)
    resource = models.ForeignKey(Resource, models.CASCADE, blank=True, null=True)

    class Meta:
        db_table = 'resources_people'

    def __str__(self):
        return self.person.full_name


class ScalesPeople(models.Model):
    id = models.AutoField(primary_key=True)
    person = models.ForeignKey(Person, models.DO_NOTHING, blank=True, null=True)
    scale = models.ForeignKey(Scale, models.DO_NOTHING, blank=True, null=True)

    class Meta:
        db_table = 'scales_people'

    def __str__(self):
        return self.person.full_name


class Species(models.Model):
    id = models.AutoField(primary_key=True)
    scientific_name = models.TextField(blank=True, null=True)
    _class = models.TextField(blank=True, null=True)
    english_name = models.TextField(blank=True, null=True)
    url = models.TextField(blank=True, null=True)

    def __str__(self):
        return '%s, %s, %s' % (self.scientific_name, self._class, self.english_name)


class PeopleFunction(models.Model):
    id = models.AutoField(primary_key=True)
    person = models.ForeignKey(Person, models.CASCADE, blank=True, null=True)
    function = models.ForeignKey(GMBA_function, models.DO_NOTHING, blank=True, null=True)

    def __str__(self):
        return self.person.full_name


class SpeciesRange(models.Model):
    id = models.AutoField(primary_key=True)
    scientific_name = models.ForeignKey(Species, models.DO_NOTHING, blank=True, null=True)
    range = models.ForeignKey(MountainRange, models.DO_NOTHING, blank=True, null=True)
    endemic = models.TextField(blank=True, null=True)
    source_url = models.TextField(blank=True, null=True)

    def __str__(self):
        return self.scientific_name.scientific_name if self and self.scientific_name else ' -- '


class PeopleRange(models.Model):
    id = models.AutoField(primary_key=True)
    person = models.ForeignKey(Person, models.CASCADE, blank=True, null=True)
    range = models.ForeignKey(MountainRange, models.DO_NOTHING, blank=True, null=True)

    def __str__(self):
        return str(self.id)


class TaxonRange(models.Model):
    id = models.AutoField(primary_key=True)
    range = models.ForeignKey(MountainRange, models.DO_NOTHING, blank=True, null=True)
    taxon = models.TextField(blank=True, null=True)
    subrange_or_region = models.TextField(blank=True, null=True)
    taxon_status = models.TextField(blank=True, null=True)
    distribution = models.TextField(blank=True, null=True)
    redlist = models.TextField(blank=True, null=True)
    count_unit = models.TextField(blank=True, null=True)
    number_of_units = models.TextField(blank=True, null=True)
    source = models.TextField(blank=True, null=True)
    remarks = models.TextField(blank=True, null=True)

    def __str__(self):
        return self.taxon if self.taxon else '--'


class PeopleResource(models.Model):
    ROLES_CHOICES = (
        ('', ''),
        ('Author', 'Author'),
        ('Chair', 'Chair'),
        ('Contributor', 'Contributor'),
        ('Coordinator', 'Coordinator'),
        ('Co - Chair', 'Co - Chair'),
        ('Editor', 'Editor'),
        ('Head', 'Head'),
        ('Member', 'Member'),
        ('Project partner', 'Project partner'),
        ('SSC', 'SSC'),
    )
    id = models.AutoField(primary_key=True)
    person = models.ForeignKey(Person, models.CASCADE, blank=True, null=True)
    resource = models.ForeignKey(Resource, models.DO_NOTHING, blank=True, null=True)
    role = models.TextField(blank=True, null=True, choices=ROLES_CHOICES)

    def __str__(self):
        return self.person.full_name if self.person else ' -- '


class RangeCountry(models.Model):
    id = models.AutoField(primary_key=True)
    range = models.ForeignKey(MountainRange, models.DO_NOTHING, blank=True, null=True)
    country = models.ForeignKey(Country, models.DO_NOTHING, blank=True, null=True)

    def __str__(self):
        return '%s --- %s' % (self.range.range_name if self.range else 'None', self.country.short_name if self.country else 'None')
