/// <summary>
        /// Creates a TableFieldDescriptionViewModel object
        /// from a ISpeciesObservationFieldDescription object.
        /// </summary>
        /// <param name="fieldDescription">The field description.</param>
        public static TableFieldDescriptionViewModel CreateFromSpeciesObservationFieldDescription(
            ISpeciesObservationFieldDescription fieldDescription)
        {
            TableFieldDescriptionViewModel model = new TableFieldDescriptionViewModel();

            model.Class            = fieldDescription.Class.GetName();
            model.Definition       = fieldDescription.Definition;
            model.DefinitionUrl    = fieldDescription.DefinitionUrl;
            model.Documentation    = fieldDescription.Documentation;
            model.DocumentationUrl = fieldDescription.DocumentationUrl;
            model.Guid             = fieldDescription.Guid;
            model.Id                      = fieldDescription.Id;
            model.Importance              = fieldDescription.Importance;
            model.IsAcceptedByTdwg        = fieldDescription.IsAcceptedByTdwg;
            model.IsClassName             = fieldDescription.IsClass;
            model.IsImplemented           = fieldDescription.IsImplemented;
            model.IsMandatory             = fieldDescription.IsMandatory;
            model.IsMandatoryFromProvider = fieldDescription.IsMandatoryFromProvider;
            model.IsObtainedFromProvider  = fieldDescription.IsObtainedFromProvider;
            model.IsPlanned               = fieldDescription.IsPlanned;
            model.Label                   = fieldDescription.Label;
            model.Name                    = fieldDescription.Name;
            model.Remarks                 = fieldDescription.Remarks;
            model.SortOrder               = fieldDescription.SortOrder;
            model.Type                    = fieldDescription.Type.ToString();
            return(model);
        }
        /// <summary>
        /// Instances a new project parameter.
        /// </summary>
        /// <param name="fieldDescription">The field description to copy information from.</param>
        /// <param name="fieldMapping">The field mapping to copy information from.</param>
        /// <returns>A new <see cref="ProjectParameterObservationDetailFieldViewModel"/> object.</returns>
        public static ProjectParameterObservationDetailFieldViewModel Create(
            ISpeciesObservationFieldDescription fieldDescription,
            ISpeciesObservationFieldMapping fieldMapping)
        {
            ProjectParameterObservationDetailFieldViewModel field = new ProjectParameterObservationDetailFieldViewModel();

            field.Label              = fieldDescription.Label;
            field.Name               = fieldDescription.Name;
            field.Class              = "Project"; //fieldDescription.Class.Identifier
            field.Importance         = fieldDescription.Importance;
            field.Type               = fieldDescription.Type;
            field.FieldId            = fieldDescription.Id;
            field.PropertyId         = fieldMapping.Id;
            field.PropertyIdentifier = fieldMapping.PropertyIdentifier;
            field.DataProviderId     = fieldMapping.DataProviderId;
            //field.Unit = ? // just exists in SpeciesObservation class.
            return(field);
        }
        /// <summary>
        /// Creates a observation field view model from species observation field description.
        /// </summary>
        /// <param name="speciesObservationFieldDescription">The species observation field description.</param>
        /// <returns>A observation field view model.</returns>
        public static ObservationDetailFieldViewModel CreateFromSpeciesObservationFieldDescription(
            ISpeciesObservationFieldDescription speciesObservationFieldDescription)
        {
            ObservationDetailFieldViewModel model = new ObservationDetailFieldViewModel();

            model.Class = speciesObservationFieldDescription.Class.GetName();
            model.Name  = speciesObservationFieldDescription.Name;
            if (!string.IsNullOrEmpty(speciesObservationFieldDescription.Label))
            {
                model.Label = speciesObservationFieldDescription.Label;
            }
            else
            {
                model.Label = model.Name;
            }
            model.Importance = speciesObservationFieldDescription.Importance;
            model.FieldId    = speciesObservationFieldDescription.Id;
            return(model);
        }
        /// <summary>
        /// Determines whether the specified field is project parameter.
        /// </summary>
        /// <param name="field">The field.</param>
        /// <returns>
        ///   <c>true</c> if the field is project parameter; otherwise, <c>false</c>.
        /// </returns>
        public static bool IsFieldProjectParameter(ISpeciesObservationFieldDescription field)
        {
            if (field.Class.Id != SpeciesObservationClassId.Project)
            {
                return(false);
            }

            if (field.Mappings.Any())
            {
                foreach (var mapping in field.Mappings)
                {
                    if (mapping.ProjectId.HasValue)
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }