{"action":"created","comment":{"url":"https://api.github.com/repos/hydroshare/hydroshare/pulls/comments/42441642","id":42441642,"diff_hunk":"@@ -0,0 +1,390 @@\n+from django.db import models\n+from mezzanine.pages.page_processors import processor_for\n+from hs_core.models import BaseResource, ResourceManager, resource_processor, CoreMetaData, AbstractMetaDataElement\n+from mezzanine.pages.models import Page\n+from django.core.exceptions import ObjectDoesNotExist, ValidationError\n+from django.contrib.contenttypes import generic\n+\n+# Create your models here.\n+\n+\n+class OriginalFileInfo(AbstractMetaDataElement):\n+\n+    term = 'OriginalFileInfo'\n+\n+    fileTypeEnum=(  (None, 'Unknown'),\n+                    (\"SHP\", \"ESRI Shapefiles\"),\n+                    (\"ZSHP\", \"Zipped ESRI Shapefiles\"),\n+                    (\"KML\", \"KML\"),\n+                    (\"KMZ\", \"KMZ\"),\n+                    (\"GML\", \"GML\"),\n+                    (\"SQLITE\", \"SQLite\")\n+                 )\n+    fileType=models.TextField(max_length=128, choices=fileTypeEnum, default=None)\n+    baseFilename=models.TextField(max_length=256, null=False, blank=False)\n+    fileCount=models.IntegerField(null=False, blank=False, default=0)\n+\n+    filenameString = models.TextField(max_length=2048, null=True, blank=True)\n+\n+    class Meta:\n+        # OriginalFileInfo element is not repeatable\n+        unique_together = (\"content_type\", \"object_id\")\n+\n+    @classmethod\n+    def create(cls, **kwargs):\n+\n+        for limit in ['fileType', 'baseFilename', 'fileCount']:\n+            if not limit in kwargs:\n+                raise ValidationError(\"For OriginalFileInfo meta, one or more attribute is missing.\")\n+\n+        metadata_obj = kwargs['content_object']\n+        ori_file_info = OriginalFileInfo.objects.create(fileType=kwargs['fileType'], baseFilename=kwargs['baseFilename'],\n+                                                  fileCount=kwargs['fileCount'],\n+                                                 content_object=metadata_obj,)\n+        # save filenameString info\n+        for key, value in kwargs.iteritems():\n+            if key in ('filenameString'):\n+                setattr(ori_file_info, key, value)\n+                ori_file_info.save()\n+\n+        return ori_file_info\n+\n+    @classmethod\n+    def update(cls, element_id, **kwargs):\n+        ori_file_info = OriginalFileInfo.objects.get(id=element_id)\n+        if ori_file_info:\n+            # save filenameString info\n+            for key, value in kwargs.iteritems():\n+                if key in ('fileType', 'baseFilename', 'fileCount', 'filenameString'):\n+                    setattr(ori_file_info, key, value)\n+                    ori_file_info.save()\n+        else:\n+            raise ObjectDoesNotExist(\"No OriginalFileInfo was found for the provided id: %d\" % element_id)\n+\n+    @classmethod\n+    def remove(cls, element_id):\n+        ori_file_info = OriginalFileInfo.objects.get(id=element_id)\n+        if ori_file_info:\n+            ori_file_info.delete()\n+        else:\n+            raise ObjectDoesNotExist(\"No OriginalFileInfo element exists for id: %d.\"%element_id)\n+\n+#\n+# Define original spatial coverage metadata info\n+class OriginalCoverage(AbstractMetaDataElement):\n+\n+    term = 'OriginalCoverage'\n+\n+    #original extent\n+    #_extent = models.CharField(max_length=1024, null=False, blank=False)\n+    northlimit = models.FloatField(null=False, blank=False)\n+    southlimit = models.FloatField(null=False, blank=False)\n+    westlimit = models.FloatField(null=False, blank=False)\n+    eastlimit = models.FloatField(null=False, blank=False)\n+\n+    #eg., prj string\n+    projection_string = models.TextField(max_length=1024, null=True, blank=True)\n+    projection_name = models.TextField(max_length=256, null=True, blank=True)\n+    datum = models.TextField(max_length=256, null=True, blank=True)\n+    unit = models.TextField(max_length=256, null=True, blank=True)\n+\n+    class Meta:\n+        # OriginalCoverage element is not repeatable\n+        unique_together = (\"content_type\", \"object_id\")\n+\n+\n+    @classmethod\n+    def create(cls, **kwargs):\n+\n+        for limit in ['northlimit', 'southlimit', 'westlimit', 'eastlimit']:\n+            if not limit in kwargs:\n+                raise ValidationError(\"For original coverage meta, one or more bounding box limits is missing.\")\n+\n+        metadata_obj = kwargs['content_object']\n+        ori_cov = OriginalCoverage.objects.create(northlimit=kwargs['northlimit'], southlimit=kwargs['southlimit'],\n+                                                  westlimit=kwargs['westlimit'],eastlimit=kwargs['eastlimit'],\n+                                                  content_object=metadata_obj,)\n+\n+        # # update projection string info\n+        for key, value in kwargs.iteritems():\n+            if key in ('projection_string','projection_name','datum','unit'):\n+                setattr(ori_cov, key, value)\n+                ori_cov.save()\n+\n+        return ori_cov\n+\n+    @classmethod\n+    def update(cls, element_id, **kwargs):\n+        ori_cov = OriginalCoverage.objects.get(id=element_id)\n+        if ori_cov:\n+            # # update projection string info\n+            for key, value in kwargs.iteritems():\n+                if key in ('projection_string','projection_name','datum','unit', 'northlimit', 'southlimit', 'eastlimit', 'westlimit'):\n+                    setattr(ori_cov, key, value)\n+                    ori_cov.save()\n+        else:\n+            raise ObjectDoesNotExist(\"No coverage element was found for the provided id: %d\" % element_id)\n+\n+    @classmethod\n+    def remove(cls, element_id):\n+        ori_cov = OriginalCoverage.objects.get(id=element_id)\n+        if ori_cov:\n+            ori_cov.delete()\n+        else:\n+            raise ObjectDoesNotExist(\"No original coverage element exists for id: %d.\"%element_id)\n+\n+\n+class FieldInformation(AbstractMetaDataElement):\n+    term = 'FieldInformation'\n+\n+    fieldName = models.CharField(max_length=128, null=False, blank=False)\n+    fieldType = models.CharField(max_length=128, null=False, blank=False)\n+    fieldTypeCode = models.CharField(max_length=50, null=True, blank=True)\n+    fieldWidth = models.IntegerField(null=True, blank=True)\n+    fieldPrecision = models.IntegerField(null=True, blank=True)\n+\n+    def __unicode__(self):\n+        self.fieldName\n+    @classmethod\n+    def create(cls, **kwargs):\n+        if 'fieldName' in kwargs:\n+            if not 'fieldType' in kwargs:\n+                raise ValidationError(\"fieldType of FieldInformation is missing.\")\n+\n+            metadata_obj = kwargs['content_object']\n+            field_info = FieldInformation.objects.create(fieldName = kwargs['fieldName'], fieldType=kwargs['fieldType'],content_object=metadata_obj,)\n+\n+            for key, value in kwargs.iteritems():\n+                if key in ('fieldTypeCode', 'fieldWidth', 'fieldPrecision'):\n+                    setattr(field_info, key, value)\n+                    field_info.save()\n+            return field_info\n+        else:\n+            raise ValidationError(\"fieldName of FieldInformation is missing.\")\n+\n+    @classmethod\n+    def update(cls, element_id, **kwargs):\n+        field_info = FieldInformation.objects.get(id=element_id)\n+        if field_info:\n+            for key, value in kwargs.iteritems():\n+                if key in ('fieldName', 'fieldTypeCode', 'fieldType', 'fieldWidth', 'fieldPrecision'):\n+                    setattr(field_info, key, value)\n+            field_info.save()\n+        else:\n+            raise ObjectDoesNotExist(\"No FieldInformation element can be found for the provided id: %s\" % kwargs['id'])\n+\n+    @classmethod\n+    def remove(cls, element_id):\n+        field_info = FieldInformation.objects.get(id=element_id)\n+        if field_info:\n+            field_info.delete()\n+        else:\n+            raise ValidationError(\"FieldInformation element of the geographic feature resource cannot be deleted: %d.\"%element_id)\n+\n+\n+class GeometryInformation(AbstractMetaDataElement):\n+    term = 'GeometryInformation'\n+\n+    featureCount = models.IntegerField(null=False, blank=False, default=0)\n+    geometryType = models.CharField(max_length=128, null=False, blank=False)\n+\n+    class Meta:\n+        # GeometryInformation element is not repeatable\n+        unique_together = (\"content_type\", \"object_id\")\n+\n+    def __unicode__(self):\n+        self.fieldName\n+    @classmethod\n+    def create(cls, **kwargs):\n+\n+        if 'geometryType' in kwargs:\n+            if not 'featureCount' in kwargs:\n+                raise ValidationError(\"featureCount of GeometryInformation is missing.\")\n+\n+            metadata_obj = kwargs['content_object']\n+            geom_info = GeometryInformation.objects.create(geometryType = kwargs['geometryType'], featureCount=kwargs['featureCount'],content_object=metadata_obj,)\n+            return geom_info\n+        else:\n+            raise ValidationError(\"geometryType of GeometryInformation is missing.\")\n+\n+    @classmethod\n+    def update(cls, element_id, **kwargs):\n+        geom_info = GeometryInformation.objects.get(id=element_id)\n+        if geom_info:\n+            for key, value in kwargs.iteritems():\n+                if key in ('geometryType', 'featureCount'):\n+                    setattr(geom_info, key, value)\n+            geom_info.save()\n+        else:\n+            raise ObjectDoesNotExist(\"No GeometryInformation element can be found for the provided id: %s\" % kwargs['id'])\n+\n+    @classmethod\n+    def remove(cls, element_id):\n+        geom_info = GeometryInformation.objects.get(id=element_id)\n+        if geom_info:\n+            geom_info.delete()\n+        else:\n+            raise ObjectDoesNotExist(\"GeometryInformation element of the geographic feature resource cannot be deleted: %d.\"%element_id)\n+\n+\n+# Define the Geographic Feature\n+class GeographicFeatureResource(BaseResource):\n+    objects = ResourceManager(\"GeographicFeatureResource\")\n+    @property\n+    def metadata(self):\n+        md = GeographicFeatureMetaData()\n+        return self._get_metadata(md)\n+\n+    @classmethod\n+    def get_supported_upload_file_types(cls):\n+    # See Shapefile format: http://resources.arcgis.com/en/help/main/10.2/index.html#//005600000003000000\n+        return (\".zip\", \".shp\", \".shx\", \".dbf\", \".prj\", \".sbx\", \".sbn\", \".cpg\", \".xml\", \".fbn\", \".fbx\", \".ain\", \".aih\", \".atx\", \".ixs\", \".mxs\")\n+\n+    @classmethod\n+    def can_have_multiple_files(cls):\n+        # can have more than one files\n+        return True\n+\n+    class Meta:\n+        verbose_name = 'Geographic Feature (ESRI Shapefiles)'\n+        proxy = True\n+\n+processor_for(GeographicFeatureResource)(resource_processor)\n+\n+# define the GeographicFeatureMetaData metadata\n+class GeographicFeatureMetaData(CoreMetaData):\n+    geometryinformation = generic.GenericRelation(GeometryInformation)\n+    fieldinformation = generic.GenericRelation(FieldInformation)\n+    originalcoverage = generic.GenericRelation(OriginalCoverage)\n+    originalfileinfo = generic.GenericRelation(OriginalFileInfo)\n+\n+    @classmethod\n+    def get_supported_element_names(cls):\n+        # get the names of all core metadata elements\n+        elements = super(GeographicFeatureMetaData, cls).get_supported_element_names()\n+        # add the name of any additional element to the list\n+        elements.append('FieldInformation')\n+        elements.append('OriginalCoverage')\n+        elements.append('GeometryInformation')\n+        elements.append('OriginalFileInfo')\n+        return elements\n+\n+    def has_all_required_elements(self):\n+        if not super(GeographicFeatureMetaData, self).has_all_required_elements():  # check required meta\n+            return False\n+        if not self.originalfileinfo.all().first():\n+            return False\n+        if not self.fieldinformation.all().first():\n+            return False\n+        if not self.originalcoverage.all().first():\n+            return False\n+        if not self.geometryinformation.all().first():\n+            return False\n+        if not (self.coverages.all().filter(type='box').first() or self.coverages.all().filter(type='point').first()):\n+            return False\n+        return True","path":"hs_geographic_feature_resource/models.py","position":285,"original_position":285,"commit_id":"0e0d5cddfaf572b54906c46e0c596a3ec74aed45","original_commit_id":"0e0d5cddfaf572b54906c46e0c596a3ec74aed45","user":{"login":"ironfroggy","id":34982,"avatar_url":"https://avatars.githubusercontent.com/u/34982?v=3","gravatar_id":"","url":"https://api.github.com/users/ironfroggy","html_url":"https://github.com/ironfroggy","followers_url":"https://api.github.com/users/ironfroggy/followers","following_url":"https://api.github.com/users/ironfroggy/following{/other_user}","gists_url":"https://api.github.com/users/ironfroggy/gists{/gist_id}","starred_url":"https://api.github.com/users/ironfroggy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ironfroggy/subscriptions","organizations_url":"https://api.github.com/users/ironfroggy/orgs","repos_url":"https://api.github.com/users/ironfroggy/repos","events_url":"https://api.github.com/users/ironfroggy/events{/privacy}","received_events_url":"https://api.github.com/users/ironfroggy/received_events","type":"User","site_admin":false},"body":"I'm not saying not to implement these functions, but that how you're implementing them can be a little more efficient.","created_at":"2015-10-20T00:02:19Z","updated_at":"2015-10-20T00:02:19Z","html_url":"https://github.com/hydroshare/hydroshare/pull/678#discussion_r42441642","pull_request_url":"https://api.github.com/repos/hydroshare/hydroshare/pulls/678","_links":{"self":{"href":"https://api.github.com/repos/hydroshare/hydroshare/pulls/comments/42441642"},"html":{"href":"https://github.com/hydroshare/hydroshare/pull/678#discussion_r42441642"},"pull_request":{"href":"https://api.github.com/repos/hydroshare/hydroshare/pulls/678"}}},"pull_request":{"url":"https://api.github.com/repos/hydroshare/hydroshare/pulls/678","id":48087366,"html_url":"https://github.com/hydroshare/hydroshare/pull/678","diff_url":"https://github.com/hydroshare/hydroshare/pull/678.diff","patch_url":"https://github.com/hydroshare/hydroshare/pull/678.patch","issue_url":"https://api.github.com/repos/hydroshare/hydroshare/issues/678","number":678,"state":"open","locked":false,"title":"1.6.1 -- big-merge-503-geographic-feature-res-type-phase-1","user":{"login":"zhiyuli","id":10070599,"avatar_url":"https://avatars.githubusercontent.com/u/10070599?v=3","gravatar_id":"","url":"https://api.github.com/users/zhiyuli","html_url":"https://github.com/zhiyuli","followers_url":"https://api.github.com/users/zhiyuli/followers","following_url":"https://api.github.com/users/zhiyuli/following{/other_user}","gists_url":"https://api.github.com/users/zhiyuli/gists{/gist_id}","starred_url":"https://api.github.com/users/zhiyuli/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zhiyuli/subscriptions","organizations_url":"https://api.github.com/users/zhiyuli/orgs","repos_url":"https://api.github.com/users/zhiyuli/repos","events_url":"https://api.github.com/users/zhiyuli/events{/privacy}","received_events_url":"https://api.github.com/users/zhiyuli/received_events","type":"User","site_admin":false},"body":"Testing coverage report\r\n\r\n```\r\nName                                       Stmts   Miss  Cover\r\n\r\n__init__                                       0      0   100%\r\nhs_access_control/__init__                     1      0   100%\r\nhs_access_control/models                     658    188    71%\r\nhs_app_netCDF/__init__                         0      0   100%\r\nhs_app_netCDF/admin                            4      0   100%\r\nhs_app_netCDF/forms                          121     70    42%\r\nhs_app_netCDF/models                         188    135    28%\r\nhs_app_netCDF/nc_functions/__init__            0      0   100%\r\nhs_app_netCDF/receivers                      195    184     6%\r\nhs_app_netCDF/serialization                  330    166    50%\r\nhs_app_netCDF/tasks                            0      0   100%\r\nhs_app_timeseries/__init__                     0      0   100%\r\nhs_app_timeseries/admin                        4      0   100%\r\nhs_app_timeseries/forms                      109     27    75%\r\nhs_app_timeseries/models                     269    169    37%\r\nhs_app_timeseries/receivers                  310    291     6%\r\nhs_app_timeseries/tasks                        0      0   100%\r\nhs_core/__init__                               0      0   100%\r\nhs_core/admin                                  8      0   100%\r\nhs_core/autocomplete_light_registry           21     14    33%\r\nhs_core/forms                                715    484    32%\r\nhs_core/hydroshare/__init__                    5      0   100%\r\nhs_core/hydroshare/date_util                  53     34    36%\r\nhs_core/hydroshare/discovery                   8      4    50%\r\nhs_core/hydroshare/hs_bagit                  132     44    67%\r\nhs_core/hydroshare/resource                  228     88    61%\r\nhs_core/hydroshare/social                     77     61    21%\r\nhs_core/hydroshare/users                     215    159    26%\r\nhs_core/hydroshare/utils                     237     76    68%\r\nhs_core/languages_iso                          1      0   100%\r\nhs_core/management/__init__                    1      0   100%\r\nhs_core/management/commands/__init__           1      0   100%\r\nhs_core/models                              1286    308    76%\r\nhs_core/receivers                             78     71     9%\r\nhs_core/serialization                        912    680    25%\r\nhs_core/signals                                9      0   100%\r\nhs_core/tasks                                  0      0   100%\r\nhs_core/templatetags/__init__                  1      0   100%\r\nhs_core/testing                               11      0   100%\r\nhs_core/views/__init__                       442    370    16%\r\nhs_core/views/pagination                       3      0   100%\r\nhs_core/views/resource_rest_api              169    113    33%\r\nhs_core/views/serializers                     75     15    80%\r\nhs_core/views/user_rest_api                    8      0   100%\r\nhs_core/views/utils                          105     78    26%\r\nhs_geo_raster_resource/__init__                0      0   100%\r\nhs_geo_raster_resource/admin                   4      0   100%\r\nhs_geo_raster_resource/forms                 154     93    40%\r\nhs_geo_raster_resource/models                177    113    36%\r\nhs_geo_raster_resource/receivers              98     88    10%\r\nhs_geo_raster_resource/serialization         341    210    38%\r\nhs_geo_raster_resource/tasks                   0      0   100%\r\nhs_geographic_feature_resource/__init__        0      0   100%\r\nhs_geographic_feature_resource/admin           4      0   100%\r\nhs_geographic_feature_resource/forms         157    104    34%\r\nhs_geographic_feature_resource/models        252     47    81%\r\nhs_geographic_feature_resource/parse_lib      84     10    88%\r\nhs_geographic_feature_resource/receivers     370     72    81%\r\nhs_metrics/__init__                            0      0   100%\r\nhs_metrics/models                              0      0   100%\r\nhs_model_program/__init__                      0      0   100%\r\nhs_model_program/admin                         4      0   100%\r\nhs_model_program/forms                        39     12    69%\r\nhs_model_program/models                       78     35    55%\r\nhs_model_program/receivers                    27     19    30%\r\nhs_modelinstance/__init__                      0      0   100%\r\nhs_modelinstance/admin                         4      0   100%\r\nhs_modelinstance/forms                        51     19    63%\r\nhs_modelinstance/models                      115     70    39%\r\nhs_modelinstance/receivers                    22     14    36%\r\nhs_modelinstance/tasks                         0      0   100%\r\nhs_swat_modelinstance/__init__                 0      0   100%\r\nhs_swat_modelinstance/admin                    5      0   100%\r\nhs_swat_modelinstance/forms                  164     61    63%\r\nhs_swat_modelinstance/models                 402    279    31%\r\nhs_swat_modelinstance/receivers               33     24    27%\r\nhs_swat_modelinstance/tasks                    0      0   100%\r\nhs_tools_resource/__init__                     0      0   100%\r\nhs_tools_resource/admin                        4      0   100%\r\nhs_tools_resource/forms                       85     30    65%\r\nhs_tools_resource/models                     169    118    30%\r\nhs_tools_resource/receivers                   39     29    26%\r\nhydroshare/__init__                            2      0   100%\r\nhydroshare/celery                             11      1    91%\r\nhydroshare/local_settings                     62      0   100%\r\nhydroshare/settings                           55      2    96%\r\nirods_browser_app/__init__                     0      0   100%\r\nirods_browser_app/models                       0      0   100%\r\nmanage                                         6      0   100%\r\nref_ts/__init__                                0      0   100%\r\nref_ts/admin                                   3      0   100%\r\nref_ts/models                                260    191    27%\r\nref_ts/receivers                              10      5    50%\r\ntheme/__init__                                 0      0   100%\r\ntheme/admin                                   12      0   100%\r\ntheme/blog_mods/__init__                       0      0   100%\r\ntheme/blog_mods/admin                          7      3    57%\r\ntheme/blog_mods/models                         0      0   100%\r\ntheme/models                                  85     12    86%\r\ntheme/templatetags/__init__                    0      0   100%\r\n\r\nTOTAL                                      10385   5490    47%\r\n```","created_at":"2015-10-19T15:33:02Z","updated_at":"2015-10-20T00:02:19Z","closed_at":null,"merged_at":null,"merge_commit_sha":"3f03606021d47a805a47031f49242077c6d6f20b","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/hydroshare/hydroshare/pulls/678/commits","review_comments_url":"https://api.github.com/repos/hydroshare/hydroshare/pulls/678/comments","review_comment_url":"https://api.github.com/repos/hydroshare/hydroshare/pulls/comments{/number}","comments_url":"https://api.github.com/repos/hydroshare/hydroshare/issues/678/comments","statuses_url":"https://api.github.com/repos/hydroshare/hydroshare/statuses/0e0d5cddfaf572b54906c46e0c596a3ec74aed45","head":{"label":"hydroshare:big-merge-503-geographic-feature-res-type-phase-1","ref":"big-merge-503-geographic-feature-res-type-phase-1","sha":"0e0d5cddfaf572b54906c46e0c596a3ec74aed45","user":{"login":"hydroshare","id":3444493,"avatar_url":"https://avatars.githubusercontent.com/u/3444493?v=3","gravatar_id":"","url":"https://api.github.com/users/hydroshare","html_url":"https://github.com/hydroshare","followers_url":"https://api.github.com/users/hydroshare/followers","following_url":"https://api.github.com/users/hydroshare/following{/other_user}","gists_url":"https://api.github.com/users/hydroshare/gists{/gist_id}","starred_url":"https://api.github.com/users/hydroshare/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hydroshare/subscriptions","organizations_url":"https://api.github.com/users/hydroshare/orgs","repos_url":"https://api.github.com/users/hydroshare/repos","events_url":"https://api.github.com/users/hydroshare/events{/privacy}","received_events_url":"https://api.github.com/users/hydroshare/received_events","type":"Organization","site_admin":false},"repo":{"id":24703136,"name":"hydroshare","full_name":"hydroshare/hydroshare","owner":{"login":"hydroshare","id":3444493,"avatar_url":"https://avatars.githubusercontent.com/u/3444493?v=3","gravatar_id":"","url":"https://api.github.com/users/hydroshare","html_url":"https://github.com/hydroshare","followers_url":"https://api.github.com/users/hydroshare/followers","following_url":"https://api.github.com/users/hydroshare/following{/other_user}","gists_url":"https://api.github.com/users/hydroshare/gists{/gist_id}","starred_url":"https://api.github.com/users/hydroshare/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hydroshare/subscriptions","organizations_url":"https://api.github.com/users/hydroshare/orgs","repos_url":"https://api.github.com/users/hydroshare/repos","events_url":"https://api.github.com/users/hydroshare/events{/privacy}","received_events_url":"https://api.github.com/users/hydroshare/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/hydroshare/hydroshare","description":"HydroShare is a collaborative website being developed for better access to data and models in the hydrologic sciences. ","fork":false,"url":"https://api.github.com/repos/hydroshare/hydroshare","forks_url":"https://api.github.com/repos/hydroshare/hydroshare/forks","keys_url":"https://api.github.com/repos/hydroshare/hydroshare/keys{/key_id}","collaborators_url":"https://api.github.com/repos/hydroshare/hydroshare/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/hydroshare/hydroshare/teams","hooks_url":"https://api.github.com/repos/hydroshare/hydroshare/hooks","issue_events_url":"https://api.github.com/repos/hydroshare/hydroshare/issues/events{/number}","events_url":"https://api.github.com/repos/hydroshare/hydroshare/events","assignees_url":"https://api.github.com/repos/hydroshare/hydroshare/assignees{/user}","branches_url":"https://api.github.com/repos/hydroshare/hydroshare/branches{/branch}","tags_url":"https://api.github.com/repos/hydroshare/hydroshare/tags","blobs_url":"https://api.github.com/repos/hydroshare/hydroshare/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/hydroshare/hydroshare/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/hydroshare/hydroshare/git/refs{/sha}","trees_url":"https://api.github.com/repos/hydroshare/hydroshare/git/trees{/sha}","statuses_url":"https://api.github.com/repos/hydroshare/hydroshare/statuses/{sha}","languages_url":"https://api.github.com/repos/hydroshare/hydroshare/languages","stargazers_url":"https://api.github.com/repos/hydroshare/hydroshare/stargazers","contributors_url":"https://api.github.com/repos/hydroshare/hydroshare/contributors","subscribers_url":"https://api.github.com/repos/hydroshare/hydroshare/subscribers","subscription_url":"https://api.github.com/repos/hydroshare/hydroshare/subscription","commits_url":"https://api.github.com/repos/hydroshare/hydroshare/commits{/sha}","git_commits_url":"https://api.github.com/repos/hydroshare/hydroshare/git/commits{/sha}","comments_url":"https://api.github.com/repos/hydroshare/hydroshare/comments{/number}","issue_comment_url":"https://api.github.com/repos/hydroshare/hydroshare/issues/comments{/number}","contents_url":"https://api.github.com/repos/hydroshare/hydroshare/contents/{+path}","compare_url":"https://api.github.com/repos/hydroshare/hydroshare/compare/{base}...{head}","merges_url":"https://api.github.com/repos/hydroshare/hydroshare/merges","archive_url":"https://api.github.com/repos/hydroshare/hydroshare/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/hydroshare/hydroshare/downloads","issues_url":"https://api.github.com/repos/hydroshare/hydroshare/issues{/number}","pulls_url":"https://api.github.com/repos/hydroshare/hydroshare/pulls{/number}","milestones_url":"https://api.github.com/repos/hydroshare/hydroshare/milestones{/number}","notifications_url":"https://api.github.com/repos/hydroshare/hydroshare/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/hydroshare/hydroshare/labels{/name}","releases_url":"https://api.github.com/repos/hydroshare/hydroshare/releases{/id}","created_at":"2014-10-02T02:19:41Z","updated_at":"2015-10-16T12:02:24Z","pushed_at":"2015-10-19T18:39:48Z","git_url":"git://github.com/hydroshare/hydroshare.git","ssh_url":"git@github.com:hydroshare/hydroshare.git","clone_url":"https://github.com/hydroshare/hydroshare.git","svn_url":"https://github.com/hydroshare/hydroshare","homepage":"https://www.hydroshare.org","size":69465,"stargazers_count":12,"watchers_count":12,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"open_issues_count":166,"forks":2,"open_issues":166,"watchers":12,"default_branch":"develop"}},"base":{"label":"hydroshare:develop","ref":"develop","sha":"80a170fa93060242e50d4f239b644ac59140a14b","user":{"login":"hydroshare","id":3444493,"avatar_url":"https://avatars.githubusercontent.com/u/3444493?v=3","gravatar_id":"","url":"https://api.github.com/users/hydroshare","html_url":"https://github.com/hydroshare","followers_url":"https://api.github.com/users/hydroshare/followers","following_url":"https://api.github.com/users/hydroshare/following{/other_user}","gists_url":"https://api.github.com/users/hydroshare/gists{/gist_id}","starred_url":"https://api.github.com/users/hydroshare/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hydroshare/subscriptions","organizations_url":"https://api.github.com/users/hydroshare/orgs","repos_url":"https://api.github.com/users/hydroshare/repos","events_url":"https://api.github.com/users/hydroshare/events{/privacy}","received_events_url":"https://api.github.com/users/hydroshare/received_events","type":"Organization","site_admin":false},"repo":{"id":24703136,"name":"hydroshare","full_name":"hydroshare/hydroshare","owner":{"login":"hydroshare","id":3444493,"avatar_url":"https://avatars.githubusercontent.com/u/3444493?v=3","gravatar_id":"","url":"https://api.github.com/users/hydroshare","html_url":"https://github.com/hydroshare","followers_url":"https://api.github.com/users/hydroshare/followers","following_url":"https://api.github.com/users/hydroshare/following{/other_user}","gists_url":"https://api.github.com/users/hydroshare/gists{/gist_id}","starred_url":"https://api.github.com/users/hydroshare/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hydroshare/subscriptions","organizations_url":"https://api.github.com/users/hydroshare/orgs","repos_url":"https://api.github.com/users/hydroshare/repos","events_url":"https://api.github.com/users/hydroshare/events{/privacy}","received_events_url":"https://api.github.com/users/hydroshare/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/hydroshare/hydroshare","description":"HydroShare is a collaborative website being developed for better access to data and models in the hydrologic sciences. ","fork":false,"url":"https://api.github.com/repos/hydroshare/hydroshare","forks_url":"https://api.github.com/repos/hydroshare/hydroshare/forks","keys_url":"https://api.github.com/repos/hydroshare/hydroshare/keys{/key_id}","collaborators_url":"https://api.github.com/repos/hydroshare/hydroshare/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/hydroshare/hydroshare/teams","hooks_url":"https://api.github.com/repos/hydroshare/hydroshare/hooks","issue_events_url":"https://api.github.com/repos/hydroshare/hydroshare/issues/events{/number}","events_url":"https://api.github.com/repos/hydroshare/hydroshare/events","assignees_url":"https://api.github.com/repos/hydroshare/hydroshare/assignees{/user}","branches_url":"https://api.github.com/repos/hydroshare/hydroshare/branches{/branch}","tags_url":"https://api.github.com/repos/hydroshare/hydroshare/tags","blobs_url":"https://api.github.com/repos/hydroshare/hydroshare/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/hydroshare/hydroshare/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/hydroshare/hydroshare/git/refs{/sha}","trees_url":"https://api.github.com/repos/hydroshare/hydroshare/git/trees{/sha}","statuses_url":"https://api.github.com/repos/hydroshare/hydroshare/statuses/{sha}","languages_url":"https://api.github.com/repos/hydroshare/hydroshare/languages","stargazers_url":"https://api.github.com/repos/hydroshare/hydroshare/stargazers","contributors_url":"https://api.github.com/repos/hydroshare/hydroshare/contributors","subscribers_url":"https://api.github.com/repos/hydroshare/hydroshare/subscribers","subscription_url":"https://api.github.com/repos/hydroshare/hydroshare/subscription","commits_url":"https://api.github.com/repos/hydroshare/hydroshare/commits{/sha}","git_commits_url":"https://api.github.com/repos/hydroshare/hydroshare/git/commits{/sha}","comments_url":"https://api.github.com/repos/hydroshare/hydroshare/comments{/number}","issue_comment_url":"https://api.github.com/repos/hydroshare/hydroshare/issues/comments{/number}","contents_url":"https://api.github.com/repos/hydroshare/hydroshare/contents/{+path}","compare_url":"https://api.github.com/repos/hydroshare/hydroshare/compare/{base}...{head}","merges_url":"https://api.github.com/repos/hydroshare/hydroshare/merges","archive_url":"https://api.github.com/repos/hydroshare/hydroshare/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/hydroshare/hydroshare/downloads","issues_url":"https://api.github.com/repos/hydroshare/hydroshare/issues{/number}","pulls_url":"https://api.github.com/repos/hydroshare/hydroshare/pulls{/number}","milestones_url":"https://api.github.com/repos/hydroshare/hydroshare/milestones{/number}","notifications_url":"https://api.github.com/repos/hydroshare/hydroshare/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/hydroshare/hydroshare/labels{/name}","releases_url":"https://api.github.com/repos/hydroshare/hydroshare/releases{/id}","created_at":"2014-10-02T02:19:41Z","updated_at":"2015-10-16T12:02:24Z","pushed_at":"2015-10-19T18:39:48Z","git_url":"git://github.com/hydroshare/hydroshare.git","ssh_url":"git@github.com:hydroshare/hydroshare.git","clone_url":"https://github.com/hydroshare/hydroshare.git","svn_url":"https://github.com/hydroshare/hydroshare","homepage":"https://www.hydroshare.org","size":69465,"stargazers_count":12,"watchers_count":12,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"open_issues_count":166,"forks":2,"open_issues":166,"watchers":12,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/hydroshare/hydroshare/pulls/678"},"html":{"href":"https://github.com/hydroshare/hydroshare/pull/678"},"issue":{"href":"https://api.github.com/repos/hydroshare/hydroshare/issues/678"},"comments":{"href":"https://api.github.com/repos/hydroshare/hydroshare/issues/678/comments"},"review_comments":{"href":"https://api.github.com/repos/hydroshare/hydroshare/pulls/678/comments"},"review_comment":{"href":"https://api.github.com/repos/hydroshare/hydroshare/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/hydroshare/hydroshare/pulls/678/commits"},"statuses":{"href":"https://api.github.com/repos/hydroshare/hydroshare/statuses/0e0d5cddfaf572b54906c46e0c596a3ec74aed45"}}}}