Add lens, category, color and year search filters

Signed-off-by: Michael Mayer <michael@liquidbytes.net>
This commit is contained in:
Michael Mayer
2019-12-28 23:06:44 +01:00
parent 8e8642cb08
commit a66d0887bd
8 changed files with 152 additions and 81 deletions

View File

@@ -59,7 +59,6 @@ seashore:
threshold: 0.3
categories:
- beach
- coast
- water
lakeside:
@@ -104,9 +103,7 @@ fashion:
label: portrait
threshold: 0.1
categories:
- fashion
- person
- face
- people
poncho:
see: fashion
@@ -274,10 +271,8 @@ stingray:
threshold: 0.2
categories:
- water
- sea
- fish
- animal
- ray
cock:
threshold: 0.2
@@ -731,7 +726,6 @@ wombat:
jellyfish:
categories:
- water
- sea
- animal
- fish
@@ -1480,20 +1474,17 @@ starfish:
threshold: 0.5
categories:
- water
- sea
- animal
- fish
sea urchin:
categories:
- water
- sea
- animal
sea cucumber:
categories:
- water
- sea
- animal
rabbit:
@@ -1789,7 +1780,6 @@ fish:
threshold: 0.2
categories:
- water
- sea
- animal
barracouta:
@@ -1903,7 +1893,7 @@ barbershop:
barn:
cateories:
- building
- architecture
bassoon:
label: entertainment
@@ -1926,7 +1916,6 @@ bathtub:
beacon:
categories:
- building
- tower
- architecture
@@ -1945,7 +1934,6 @@ beer glass:
bell cote:
label: church
categories:
- building
- architecture
bicycle-built-for-two:
@@ -1956,13 +1944,12 @@ bicycle-built-for-two:
birdhouse:
categories:
- building
- house
- bird
- outdoor
boathouse:
categories:
- building
- house
- architecture
- water
bobsled:
@@ -2030,9 +2017,7 @@ car wheel:
castle:
categories:
- building
- old
- architecture
- historic
catamaran:
categories:
@@ -2169,7 +2154,6 @@ disk brake:
dock:
categories:
- water
- sea
dogsled:
categories:
@@ -2389,7 +2373,6 @@ library:
lifeboat:
categories:
- water
- sea
- boat
lighter:
@@ -2457,13 +2440,11 @@ microwave:
minibus:
label: bus
categories:
- van
- vehicle
minivan:
label: van
categories:
- car
- vehicle
mixing bowl:
@@ -2511,7 +2492,6 @@ moving van:
label: van
categories:
- vehicle
- bus
notebook:
label: computer
@@ -2548,7 +2528,6 @@ paddle:
paddlewheel:
categories:
- water
- sea
padlock:
label: tool
@@ -2565,7 +2544,7 @@ paintbrush:
palace:
label: historic architecture
categories:
- building
- historic
panpipe:
label: goods
@@ -2657,7 +2636,6 @@ police van:
label: van
categories:
- vehicle
- bus
pool table:
categories:
@@ -2699,8 +2677,6 @@ punching bag:
recreational vehicle:
label: camper
categories:
- bus
- van
- vehicle
reflex camera:
@@ -2806,7 +2782,6 @@ snorkel:
categories:
- swimming
- water
- sea
snowmobile:
categories:
@@ -2841,7 +2816,6 @@ spatula:
speedboat:
categories:
- water
- sea
- boat
sports car:
@@ -2885,7 +2859,6 @@ studio couch:
submarine:
categories:
- water
- sea
- boat
suspension bridge:
@@ -2939,7 +2912,6 @@ trimaran:
categories:
- boat
- water
- sea
triumphal arch:
categories:
@@ -2949,7 +2921,6 @@ triumphal arch:
trolleybus:
label: bus
categories:
- van
- vehicle
trombone:
@@ -3022,10 +2993,8 @@ wreck:
yawl:
categories:
- ship
- boat
- water
- sea
- vehicle
yurt:
@@ -3347,7 +3316,6 @@ tile roof:
label: building
categories:
- architecture
- house
croquet ball:
label: pumpkin
@@ -3463,8 +3431,6 @@ band aid:
portrait:
label: portrait
categories:
- person
- face
- people
oxygen mask:
@@ -3480,8 +3446,6 @@ heritage:
label: portrait
categories:
- people
- person
- face
safety pin:
priority: -1
@@ -3500,10 +3464,7 @@ vestment:
bassinet:
label: baby
categories:
- person
- child
- portrait
- face
- people
patio:
label: building

View File

@@ -54,18 +54,18 @@
item-value="code"
item-text="name"
v-model="filter.country"
:items="options.countries">
:items="countryOptions">
</v-select>
</v-flex>
<v-flex xs12 sm6 md3 pa-2 class="p-camera-select">
<v-select @change="dropdownChange"
:label="labels.camera"
:label="labels.year"
flat solo hide-details
color="secondary-dark"
item-value="ID"
item-text="CameraModel"
v-model="filter.camera"
:items="options.cameras">
item-value="year"
item-text="label"
v-model="filter.year"
:items="yearOptions">
</v-select>
</v-flex>
<v-flex xs12 sm6 md3 pa-2 class="p-view-select">
@@ -87,7 +87,51 @@
:items="options.sorting">
</v-select>
</v-flex>
<v-flex xs6 pa-2 class="p-time-after">
<v-flex xs12 sm6 md3 pa-2 class="p-camera-select">
<v-select @change="dropdownChange"
:label="labels.camera"
flat solo hide-details
color="secondary-dark"
item-value="ID"
item-text="CameraModel"
v-model="filter.camera"
:items="cameraOptions">
</v-select>
</v-flex>
<v-flex xs12 sm6 md3 pa-2 class="p-camera-select">
<v-select @change="dropdownChange"
:label="labels.lens"
flat solo hide-details
color="secondary-dark"
item-value="ID"
item-text="LensModel"
v-model="filter.lens"
:items="lensOptions">
</v-select>
</v-flex>
<v-flex xs12 sm6 md3 pa-2 class="p-camera-select">
<v-select @change="dropdownChange"
:label="labels.color"
flat solo hide-details
color="secondary-dark"
item-value="name"
item-text="label"
v-model="filter.color"
:items="colorOptions">
</v-select>
</v-flex>
<v-flex xs12 sm6 md3 pa-2 class="p-camera-select">
<v-select @change="dropdownChange"
:label="labels.category"
flat solo hide-details
color="secondary-dark"
item-value="LabelName"
item-text="Title"
v-model="filter.label"
:items="categoryOptions">
</v-select>
</v-flex>
<!-- v-flex xs6 pa-2 class="p-time-after">
<v-menu v-model="showAfterPicker"
:close-on-content-click="false"
:nudge-right="40"
@@ -136,7 +180,7 @@
@input="datepickerChange">
</v-date-picker>
</v-menu>
</v-flex>
</v-flex -->
</v-layout>
</v-card-text>
</v-card>
@@ -152,42 +196,69 @@
filterChange: Function,
},
data() {
const cameras = [{ID: 0, CameraModel: this.$gettext('All Cameras')}].concat(this.$config.getValue('cameras'));
const countries = [{
code: '',
name: this.$gettext('All Countries')
}].concat(this.$config.getValue('countries'));
return {
config: this.$config.values,
searchExpanded: false,
all: {
countries: [{ code: "", name: this.$gettext("All Countries")}],
cameras: [{ID: 0, CameraModel: this.$gettext("All Cameras")}],
lenses: [{ID: 0, LensModel: "All Lenses"}],
colors: [{label: "All Colors", name: ""}],
categories: [{LabelName: "", Title: this.$gettext("All Categories")}],
},
options: {
'views': [
// {value: 'tiles', text: this.$gettext('Tiles')},
{value: 'mosaic', text: this.$gettext('Mosaic')},
{value: 'details', text: this.$gettext('Details')},
{value: 'list', text: this.$gettext('List')},
],
'countries': countries,
'cameras': cameras,
'sorting': [
{value: 'imported', text: this.$gettext('Recently imported')},
{value: 'newest', text: this.$gettext('Newest first')},
{value: 'oldest', text: this.$gettext('Oldest first')},
],
},
showAfterPicker: false,
showBeforePicker: false,
// showAfterPicker: false,
// showBeforePicker: false,
labels: {
search: this.$gettext("Search"),
view: this.$gettext("View"),
country: this.$gettext("Country"),
camera: this.$gettext("Camera"),
lens: this.$gettext("Lens"),
year: this.$gettext("Year"),
color: this.$gettext("Color"),
category: this.$gettext("Category"),
sort: this.$gettext("Sort By"),
before: this.$gettext("Taken before"),
after: this.$gettext("Taken after"),
},
};
},
computed: {
countryOptions() {
return this.all.countries.concat(this.config.countries);
},
cameraOptions() {
return this.all.cameras.concat(this.config.cameras);
},
lensOptions() {
return this.all.lenses.concat(this.config.lenses);
},
colorOptions() {
return this.all.colors.concat(this.config.colors);
},
categoryOptions() {
return this.all.categories.concat(this.config.categories);
},
yearOptions() {
let result = [{"year": 0, "label": "All Years"}];
for (let i = 0; i < this.config.years.length; i++) {
result.push({"year": this.config.years[i], "label": this.config.years[i].toString()});
}
return result;
},
},
methods: {
dropdownChange() {
this.filterChange();
@@ -196,16 +267,12 @@
this.searchExpanded = false;
}
},
datepickerChange() {
/*datepickerChange() {
this.showAfterPicker = false;
this.showBeforePicker = false;
this.dropdownChange();
},
setView(name) {
this.settings.view = name;
this.filterChange();
},
clearBefore() {
this.filter.before = '';
this.datepickerChange();
@@ -213,11 +280,16 @@
clearAfter() {
this.filter.after = '';
this.datepickerChange();
},
*/
setView(name) {
this.settings.view = name;
this.filterChange();
},
clearQuery() {
this.filter.q = '';
this.filterChange();
},
}
},
};
</script>

View File

@@ -50,8 +50,14 @@
this.filter.q = query['q'] ? query['q'] : '';
this.filter.camera = query['camera'] ? parseInt(query['camera']) : 0;
this.filter.country = query['country'] ? query['country'] : '';
this.filter.before = query['before'] ? query['before'] : '';
this.filter.after = query['after'] ? query['after'] : '';
this.filter.lens = query['lens'] ? parseInt(query['lens']) : 0;
this.filter.year = query['year'] ? parseInt(query['year']) : 0;
this.filter.color = query['color'] ? query['color'] : '';
this.filter.label = query['label'] ? query['label'] : '';
// this.filter.before = query['before'] ? query['before'] : '';
// this.filter.after = query['after'] ? query['after'] : '';
this.settings.view = this.viewType();
this.lastFilter = {};
this.routeName = this.$route.name;
@@ -64,11 +70,28 @@
const order = query['order'] ? query['order'] : 'imported';
const camera = query['camera'] ? parseInt(query['camera']) : 0;
const q = query['q'] ? query['q'] : '';
const before = query['before'] ? query['before'] : '';
const after = query['after'] ? query['after'] : '';
// const before = query['before'] ? query['before'] : '';
// const after = query['after'] ? query['after'] : '';
const country = query['country'] ? query['country'] : '';
const lens = query['lens'] ? parseInt(query['lens']) : 0;
const year = query['year'] ? parseInt(query['year']) : 0;
const color = query['color'] ? query['color'] : '';
const label = query['label'] ? query['label'] : '';
const view = this.viewType();
const filter = {country: country, camera: camera, order: order, q: q, before: before, after: after};
const filter = {
country: country,
camera: camera,
lens: lens,
label: label,
year: year,
color: color,
order: order,
q: q,
/* before: before,
after: after, */
};
const settings = {view: view};
return {

View File

@@ -61,17 +61,17 @@ var All = Colors{
Cyan,
Blue,
Purple,
Brown,
White,
Grey,
Black,
Brown,
}
var Names = map[Color]string{
Black: "dark", // 0
Brown: "brown", // 1
Grey: "grey", // 2
White: "bright", // 3
White: "white", // 3
Purple: "purple", // 4
Gold: "gold", // 5
Blue: "blue", // 6

View File

@@ -652,7 +652,7 @@ func (c *Config) ClientConfig() ClientConfig {
Limit(20).Order("album_name").
Find(&albums)
var years []string
var years []int
db.Table("photos").
Order("photo_year DESC").

View File

@@ -35,8 +35,11 @@ type PhotoSearch struct {
Album string `form:"album"`
Label string `form:"label"`
Country string `form:"country"`
Year uint `form:"year"`
Month uint `form:"month"`
Color string `form:"color"`
Camera int `form:"camera"`
Lens int `form:"lens"`
Before time.Time `form:"before" time_format:"2006-01-02"`
After time.Time `form:"after" time_format:"2006-01-02"`
Favorites bool `form:"favorites"`

View File

@@ -233,9 +233,9 @@ func TestTensorFlow_BestLabels(t *testing.T) {
result := tensorFlow.bestLabels(p)
assert.Equal(t, "chicken", result[0].Name)
assert.Equal(t, "bird", result[0].Categories[0])
assert.Equal(t, "animal", result[1].Categories[1])
assert.Equal(t, "image", result[0].Source)
assert.Equal(t, "fish", result[1].Name)
assert.Equal(t, "animal", result[1].Categories[2])
assert.Equal(t, "image", result[1].Source)
t.Log(result)
})

View File

@@ -193,6 +193,18 @@ func (s *Repo) Photos(f form.PhotoSearch) (results []PhotoResult, err error) {
q = q.Where("photos.camera_id = ?", f.Camera)
}
if f.Lens > 0 {
q = q.Where("photos.lens_id = ?", f.Lens)
}
if f.Year > 0 {
q = q.Where("photos.photo_year = ?", f.Year)
}
if f.Month > 0 {
q = q.Where("photos.photo_month = ?", f.Month)
}
if f.Color != "" {
q = q.Where("files.file_main_color = ?", strings.ToLower(f.Color))
}