Exemplo n.º 1
0
        private List <ThumbnailModel> GetSiteYearSummary(long siteID)
        {
            List <ThumbnailModel> Years = new List <ThumbnailModel>();

            string siteName = CollectionRepository.Find(c => c.Site.ID == siteID).FirstOrDefault().Site.Name;

            List <int> yearStrings = PhotoRepository.Find(p => p.Site.ID == siteID).Select(p => p.Captured.Year).Distinct().ToList <int>();

            foreach (int y in yearStrings)
            {
                ThumbnailModel model = new ThumbnailModel();

                model.Name = Convert.ToString(y);

                Photo[] photos = PhotoRepository.Find(p => p.Site.ID == siteID && p.Captured.Year == y)
                                 .ToArray();
                model.PhotoCount = photos.Count();
                model.First      = photos[0].Captured;
                model.Last       = photos[photos.Count() - 1].Captured;

                photos = photos.Where(p => p.Captured.Hour > 12 && p.Captured.Hour < 16).ToArray();

                Random rand = new Random();
                model.CoverPhotoID = photos[rand.Next(photos.Length)].ID;

                model.Link = "/Search/Index?site=" + siteName + "&year=" + model.Name;

                Years.Add(model);
            }

            return(Years);
        }
Exemplo n.º 2
0
        public void NewUserCollection(User user, string collectionName, string photoIds)
        {
            List <Photo> photos;

            long[] ids;
            if (!String.IsNullOrWhiteSpace(photoIds))
            {
                ids    = photoIds.Split(',').Select(i => Convert.ToInt64(i)).ToArray();
                photos = PhotoRepository.Find(p => ids.Contains(p.ID), p => p.Site).ToList();
            }
            else
            {
                ids    = new long[0];
                photos = new List <Photo>();
            }

            Guid containerID = Guid.NewGuid();

            //save the collection
            Collection c = new Collection()
            {
                Name        = collectionName,
                ContainerID = containerID.ToString(),
                Owner       = user,
                Type        = CollectionType.USER,
                Status      = CollectionStatus.COMPLETE,
                Photos      = photos
            };

            CollectionRepository.Insert(c);
            Unit.Commit();
        }
Exemplo n.º 3
0
        private CollectionViewModel GetCollectionViewModel(long siteID, long year)
        {
            CollectionViewModel model = new CollectionViewModel();

            model.Collection = CollectionRepository.First(c => c.Site.ID == siteID);
            model.SiteCoords = string.Format("{0}, {1}", model.Collection.Site.Latitude, model.Collection.Site.Longitude);

            List <Photo> photos = PhotoRepository.Find(p => p.Site.ID == model.Collection.Site.ID).OrderBy(p => p.Captured).ToList <Photo>();

            if (year != -1)
            {
                photos = photos.Where(p => p.Captured.Year == year).ToList <Photo>();
            }

            model.SiteDetails = new SiteDetails()
            {
                PhotoCount = photos.Count(), First = photos.Select(p => p.Captured).First(), Last = photos.Select(p => p.Captured).Last()
            };

            Phocalstream_Shared.Data.Model.Photo.User User = UserRepository.First(u => u.ProviderID == this.User.Identity.Name);
            if (User != null)
            {
                UserCollectionList userCollectionModel = new UserCollectionList();
                userCollectionModel.User        = User;
                userCollectionModel.Collections = CollectionRepository.Find(c => c.Owner.ID == User.ID && c.Type == CollectionType.USER, c => c.Photos).ToList();
                model.UserCollections           = userCollectionModel;
            }

            return(model);
        }
Exemplo n.º 4
0
        public ActionResult SiteDashboard(long siteID)
        {
            // Make sure the siteID belongs to a CameraSite
            if (CollectionRepository.Find(c => c.Site.ID == siteID && c.Type == CollectionType.SITE).FirstOrDefault() == null)
            {
                return(RedirectToAction("SiteList", "Home", null));
            }
            else
            {
                SiteDashboardViewModel model = new SiteDashboardViewModel();

                model.CollectionViewModel = GetCollectionViewModel(siteID, -1);
                model.Years = GetSiteYearSummary(siteID);
                model.Tags  = PhotoService.GetPopularTagsForSite(siteID);

                //Photo Frequency
                model.PhotoFrequency           = GetPhotoFrequencyData(siteID);
                model.PhotoFrequency.SiteName  = model.CollectionViewModel.Collection.Site.Name;
                model.PhotoFrequency.StartDate = model.CollectionViewModel.SiteDetails.First;

                Photo    lastPhoto     = PhotoRepository.Find(p => p.Site.ID == siteID).OrderBy(p => p.Captured).Last();
                DateTime lastPhotoDate = lastPhoto.Captured;

                model.DroughtMonitorData         = LoadDMData(DMDataType.COUNTY, lastPhotoDate, model.CollectionViewModel.Collection.Site.CountyFips);
                model.DroughtMonitorData.PhotoID = lastPhoto.ID;

                model.WaterData         = LoadWaterData(model.CollectionViewModel.Collection.Site.Latitude, model.CollectionViewModel.Collection.Site.Longitude, lastPhotoDate);
                model.WaterData.PhotoID = lastPhoto.ID;

                return(View(model));
            }
        }
Exemplo n.º 5
0
        /// <summary>
        /// 指定したディレクトリ直下のフォトのリストを返す
        /// </summary>
        /// <param name="directoryName"></param>
        /// <returns></returns>
        public IEnumerable <Photo> Execute(string directoryName)
        {
            IEnumerable <Domain.Model.File> files = photoFileService.FindAllPhotoFilesFromDirectory(directoryName);
            List <Photo> photosInDirectory        = new List <Photo>();

            foreach (File file in files)
            {
                Func <IQueryable <Photo>, Photo> query = allPhotos =>
                {
                    foreach (Photo photo in allPhotos)
                    {
                        if (photo.File.FilePath == file.FilePath)
                        {
                            return(photo);
                        }
                    }

                    return(Photo.CreateFromFile(file));
                };

                Photo hitPhoto = photoRepository.Find(query);

                if (hitPhoto != null)
                {
                    photosInDirectory.Add(hitPhoto);
                }
                else
                {
                    photosInDirectory.Add(Photo.CreateFromFile(file));
                }
            }

            return(photosInDirectory);
        }
Exemplo n.º 6
0
        public ActionResult Timelapse(long collectionId)
        {
            TimelapseModel model      = new TimelapseModel();
            Collection     collection = CollectionRepository.Find(c => c.ID == collectionId, c => c.Photos, c => c.Site).FirstOrDefault();

            if (collection != null)
            {
                model.CollectionId = collection.ID;
                model.Name         = !String.IsNullOrWhiteSpace(collection.Name) ? collection.Name : "Dynamic Timelapse";

                long[] ids;
                switch (collection.Type)
                {
                case CollectionType.SITE:
                    ids = PhotoRepository.Find(p => p.Site.ID == collection.Site.ID).Select(p => p.ID).ToArray <long>();
                    break;

                case CollectionType.USER:
                    ids = collection.Photos.Select(p => p.ID).ToArray <long>();
                    break;

                case CollectionType.SEARCH:
                    ids = collection.Photos.Select(p => p.ID).ToArray <long>();
                    break;

                case CollectionType.TIMELAPSE:
                    ids = collection.Photos.Select(p => p.ID).ToArray <long>();
                    break;

                default:
                    ids = new long[0];
                    break;
                }

                if (ids.Length > 0)
                {
                    model.DmWeeks = DZPhotoRepository.FindDmDatesForPhotos(ids);
                    model.Frames  = PhotoService.CreateTimeLapseFramesFromIDs(ids);

                    long id = model.Frames.FirstOrDefault().PhotoID;

                    Photo first = PhotoRepository.Find(p => p.ID == id, p => p.Site).FirstOrDefault();
                    model.CountyFips = first.Site.CountyFips;
                    model.Latitude   = first.Site.Latitude;
                    model.Longitude  = first.Site.Longitude;

                    model.Width  = first.Width;
                    model.Height = first.Height;

                    return(View(model));
                }
            }

            return(RedirectToAction("Index", "Search", null));
        }
        /// <summary>
        /// 指定したディレクトリ直下のフォトのリストを返す
        /// </summary>
        /// <param name="dirpath"></param>
        /// <returns></returns>
        public List <Photo> Execute(string dirpath)
        {
            //ディレクトリパスが入力されていない場合
            if (dirpath.Length == 0 || dirpath == null)
            {
                throw new ArgumentNullException("ディレクトリパスが入力されていません");
            }

            //ディレクトリ内に存在する写真ファイルの一覧を取得(Fileインスタンス)
            IEnumerable <Domain.Model.File> files = photoFileService.FindAllPhotoFilesFromDirectory(dirpath);

            List <Photo> photosInDirectory = new List <Photo>();

            foreach (File file in files)
            {
                //クエリ
                Func <IQueryable <Photo>, IQueryable <Photo> > query = allPhotos =>
                {
                    List <Photo> photos = new List <Photo>();
                    foreach (Photo photo in allPhotos)
                    {
                        if (photo.File.FilePath == file.FilePath)
                        {
                            photos.Add(photo);
                        }
                    }
                    if (photos.Count() == 0)
                    {
                        photos.Add(Photo.CreateFromFile(file));
                    }
                    return(photos.AsQueryable());
                };

                //既にDBに写真データが登録されているか
                Photo hitPhoto = photoRepository.Find(query).First();

                //登録されていたら
                if (hitPhoto != null)
                {
                    photosInDirectory.Add(hitPhoto);
                }
                //登録されていなかったら
                else
                {
                    photosInDirectory.Add(Photo.CreateFromFile(file));
                }
            }
            //写真ファイルが存在しなかった場合
            if (photosInDirectory == null)
            {
                return(null);
            }
            return(photosInDirectory);
        }
Exemplo n.º 8
0
        public void RemoveFromExistingUserCollection(User user, long collectionID, string photoIds)
        {
            long[]       ids    = photoIds.Split(',').Select(i => Convert.ToInt64(i)).ToArray();
            List <Photo> photos = PhotoRepository.Find(p => ids.Contains(p.ID)).ToList();

            Collection collection = CollectionRepository.First(c => c.ID == collectionID && c.Type == CollectionType.USER, c => c.Photos);

            collection.Photos = collection.Photos.Except(photos).ToList();
            collection.Status = CollectionStatus.INVALID;
            Unit.Commit();
        }
Exemplo n.º 9
0
        public void AddToExistingUserCollection(User user, string collectionIds, string photoIds)
        {
            long[]       ids    = photoIds.Split(',').Select(i => Convert.ToInt64(i)).ToArray();
            List <Photo> photos = PhotoRepository.Find(p => ids.Contains(p.ID)).ToList();

            long[]            cIds        = collectionIds.Split(',').Select(i => Convert.ToInt64(i)).ToArray();
            List <Collection> collections = CollectionRepository.Find(c => cIds.Contains(c.ID) && c.Type == CollectionType.USER, c => c.Photos).ToList();

            foreach (var col in collections)
            {
                col.Photos = col.Photos.Union(photos).ToList();
                col.Status = CollectionStatus.INVALID;
            }
            Unit.Commit();
        }
Exemplo n.º 10
0
        public void TogglePhotoInUserCollection(long photoID, long collectionID)
        {
            Collection col = CollectionRepository.First(c => c.ID == collectionID, c => c.Photos);

            if (col.Type == CollectionType.USER)
            {
                Photo photo = PhotoRepository.Find(photoID);

                if (col.Photos.Contains(photo))
                {
                    col.Photos.Remove(photo);
                }
                else
                {
                    col.Photos.Add(photo);
                }

                col.Status = CollectionStatus.INVALID;
                Unit.Commit();
            }
        }
Exemplo n.º 11
0
        public ICollection <TimeLapseFrame> CreateTimeLapseFramesFromIDs(long[] photoIDs)
        {
            List <TimeLapseFrame> frames = new List <TimeLapseFrame>();
            long firstID = photoIDs[0]; // stupid LINQ

            USCounty county = DMRepository.GetCountyForFips(PhotoRepository.Find(p => p.ID == firstID, p => p.Site)
                                                            .FirstOrDefault().Site.CountyFips);

            var properties = PhotoRepo.GetPhotoProperties(photoIDs, new string[] { "ID", "Captured" });

            foreach (var property in properties)
            {
                var frame = new TimeLapseFrame()
                {
                    FrameTime = (DateTime)property["Captured"], PhotoID = (long)property["ID"]
                };
                frames.Add(frame);
            }

            return(frames);
        }
Exemplo n.º 12
0
        private PhotoFrequencyData GetPhotoFrequencyData(long siteID)
        {
            PhotoFrequencyData model = new PhotoFrequencyData();

            var data = PhotoRepository.Find(p => p.Site.ID == siteID)
                       .GroupBy(p => p.Captured.Date)
                       .Select(group => new
            {
                Date  = group.Key,
                Count = group.Count()
            })
                       .OrderBy(x => x.Date);

            model.FrequencyDataValues = "";
            foreach (var d in data)
            {
                model.FrequencyDataValues += d.Count + ", ";
            }

            model.FrequencyDataValues = model.FrequencyDataValues.Substring(0, model.FrequencyDataValues.Length - 2);

            return(model);
        }
Exemplo n.º 13
0
        public long NewTimelapseCollection(User user, string timelapseName, string photoIds)
        {
            // Use the hash of the photoIds as the container id so we can check if timelapse already exists
            string containerID = Convert.ToString(photoIds.GetHashCode());

            List <Photo> photos;

            long[] ids;

            // Only logged in users can own and name a collection
            if (user != null)
            {
                // See if the user already has a collection for those photos, if so return that collection id
                Collection existingUserCollection = CollectionRepository.Find(c => c.ContainerID == containerID & c.Owner.ID == user.ID).FirstOrDefault();
                if (existingUserCollection != null)
                {
                    // see if the name is the same, if not, overwrite
                    if (!existingUserCollection.Name.Equals(timelapseName))
                    {
                        existingUserCollection.Name = timelapseName;
                        Unit.Commit();
                    }

                    return(existingUserCollection.ID);
                }
                else
                {
                    if (!String.IsNullOrWhiteSpace(photoIds))
                    {
                        ids    = photoIds.Split(',').Select(i => Convert.ToInt64(i)).ToArray();
                        photos = PhotoRepository.Find(p => ids.Contains(p.ID), p => p.Site).ToList();

                        Collection c = new Collection()
                        {
                            Name        = timelapseName,
                            ContainerID = containerID.ToString(),
                            Owner       = user,
                            Type        = CollectionType.TIMELAPSE,
                            Status      = CollectionStatus.COMPLETE,
                            Photos      = photos
                        };
                        CollectionRepository.Insert(c);
                        Unit.Commit();

                        return(c.ID);
                    }
                }
            }
            else
            {
                // Since the user is not logged in, check if an un-owned copy of this collection exists
                Collection existingCollection = CollectionRepository.Find(c => c.ContainerID == containerID & c.Owner == null).FirstOrDefault();
                if (existingCollection != null)
                {
                    return(existingCollection.ID);
                }
                else
                {
                    if (!String.IsNullOrWhiteSpace(photoIds))
                    {
                        ids    = photoIds.Split(',').Select(i => Convert.ToInt64(i)).ToArray();
                        photos = PhotoRepository.Find(p => ids.Contains(p.ID), p => p.Site).ToList();

                        Collection c = new Collection()
                        {
                            Name        = timelapseName,
                            ContainerID = containerID.ToString(),
                            Owner       = null,
                            Type        = CollectionType.TIMELAPSE,
                            Status      = CollectionStatus.COMPLETE,
                            Photos      = photos
                        };
                        CollectionRepository.Insert(c);
                        Unit.Commit();

                        return(c.ID);
                    }
                }
            }

            // something went wrong, so return -1
            return(-1);
        }