yarn build

This commit is contained in:
smilerz 2021-07-30 16:30:23 -05:00
parent 2da0f5c478
commit 1f21631c5a
11 changed files with 47 additions and 29 deletions

View File

@ -4,7 +4,7 @@ from recipes import settings
from django.contrib.postgres.search import ( from django.contrib.postgres.search import (
SearchQuery, SearchRank, TrigramSimilarity SearchQuery, SearchRank, TrigramSimilarity
) )
from django.db.models import Q, Subquery, Case, When, Value from django.db.models import Max, Q, Subquery, Case, When, Value
from django.utils import translation from django.utils import translation
from cookbook.managers import DICTIONARY from cookbook.managers import DICTIONARY
@ -35,15 +35,16 @@ def search_recipes(request, queryset, params):
return queryset.filter(pk__in=last_viewed_recipes[len(last_viewed_recipes) - min(len(last_viewed_recipes), search_last_viewed):]) return queryset.filter(pk__in=last_viewed_recipes[len(last_viewed_recipes) - min(len(last_viewed_recipes), search_last_viewed):])
orderby = []
if search_new == 'true': if search_new == 'true':
queryset = queryset.annotate( queryset = queryset.annotate(
new_recipe=Case(When(created_at__gte=(datetime.now() - timedelta(days=7)), then=Value(100)), new_recipe=Case(When(created_at__gte=(datetime.now() - timedelta(days=7)), then=Value(100)),
default=Value(0), )).order_by('-new_recipe', 'name') default=Value(0), ))
orderby += ['new_recipe']
else: else:
queryset = queryset.order_by('name') queryset = queryset
search_type = search_prefs.search or 'plain' search_type = search_prefs.search or 'plain'
search_sort = None
if len(search_string) > 0: if len(search_string) > 0:
unaccent_include = search_prefs.unaccent.values_list('field', flat=True) unaccent_include = search_prefs.unaccent.values_list('field', flat=True)
@ -109,13 +110,14 @@ def search_recipes(request, queryset, params):
else: else:
query_filter = f query_filter = f
# TODO this is kind of a dumb method to sort. create settings to choose rank vs most often made, date created or rating # TODO add order by user settings - only do search rank and annotation if rank order is configured
search_rank = ( search_rank = (
SearchRank('name_search_vector', search_query, cover_density=True) SearchRank('name_search_vector', search_query, cover_density=True)
+ SearchRank('desc_search_vector', search_query, cover_density=True) + SearchRank('desc_search_vector', search_query, cover_density=True)
+ SearchRank('steps__search_vector', search_query, cover_density=True) + SearchRank('steps__search_vector', search_query, cover_density=True)
) )
queryset = queryset.filter(query_filter).annotate(rank=search_rank) queryset = queryset.filter(query_filter).annotate(rank=search_rank)
orderby += ['-rank']
else: else:
queryset = queryset.filter(query_filter) queryset = queryset.filter(query_filter)
@ -147,8 +149,10 @@ def search_recipes(request, queryset, params):
if search_random == 'true': if search_random == 'true':
queryset = queryset.order_by("?") queryset = queryset.order_by("?")
elif search_sort == 'rank': else:
queryset = queryset.order_by('-rank') # TODO add order by user settings
orderby += ['name']
queryset = queryset.order_by(*orderby)
return queryset return queryset

View File

@ -4,7 +4,6 @@ from rest_framework.schemas.utils import is_list_view
# TODO move to separate class to cleanup # TODO move to separate class to cleanup
class RecipeSchema(AutoSchema): class RecipeSchema(AutoSchema):
def get_path_parameters(self, path, method): def get_path_parameters(self, path, method):
if not is_list_view(path, method, self.view): if not is_list_view(path, method, self.view):
return super(RecipeSchema, self).get_path_parameters(path, method) return super(RecipeSchema, self).get_path_parameters(path, method)
@ -55,6 +54,11 @@ class RecipeSchema(AutoSchema):
"description": 'true or false. returns the results in randomized order.', "description": 'true or false. returns the results in randomized order.',
'schema': {'type': 'string', }, 'schema': {'type': 'string', },
}) })
parameters.append({
"name": 'new', "in": "query", "required": False,
"description": 'true or false. returns new results first in search results',
'schema': {'type': 'string', },
})
return parameters return parameters

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -19,7 +19,7 @@ from django.contrib.staticfiles.storage import staticfiles_storage
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from dotenv import load_dotenv from dotenv import load_dotenv
from webpack_loader.loader import WebpackLoader from webpack_loader.loader import WebpackLoader
# load_dotenv() load_dotenv()
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Get vars from .env files # Get vars from .env files
@ -280,14 +280,14 @@ else:
# } # }
# SQLite testing DB # SQLite testing DB
DATABASES = { # DATABASES = {
'default': { # 'default': {
'ENGINE': 'django.db.backends.sqlite3', # 'ENGINE': 'django.db.backends.sqlite3',
'OPTIONS': ast.literal_eval(os.getenv('DB_OPTIONS')) if os.getenv('DB_OPTIONS') else {}, # 'OPTIONS': ast.literal_eval(os.getenv('DB_OPTIONS')) if os.getenv('DB_OPTIONS') else {},
'NAME': 'db.sqlite3', # 'NAME': 'db.sqlite3',
'CONN_MAX_AGE': 600, # 'CONN_MAX_AGE': 600,
} # }
} # }
CACHES = { CACHES = {
'default': { 'default': {

View File

@ -450,6 +450,7 @@ export default {
let parent = {} let parent = {}
let pageSize = 200 let pageSize = 200
let keyword = String(kw.id) let keyword = String(kw.id)
console.log(apiClient.listRecipes)
apiClient.listRecipes( apiClient.listRecipes(
undefined, keyword, undefined, undefined, undefined, undefined, undefined, keyword, undefined, undefined, undefined, undefined,

View File

@ -380,6 +380,7 @@ export default {
refreshData: function (random) { refreshData: function (random) {
this.random_search = random this.random_search = random
let apiClient = new ApiApiFactory() let apiClient = new ApiApiFactory()
apiClient.listRecipes( apiClient.listRecipes(
this.settings.search_input, this.settings.search_input,
this.settings.search_keywords.map(function (A) { this.settings.search_keywords.map(function (A) {

View File

@ -4193,12 +4193,13 @@ export const ApiApiAxiosParamCreator = function (configuration?: Configuration)
* @param {string} [booksOr] If recipe should be in all (AND) or any (OR) any of the provided books. * @param {string} [booksOr] If recipe should be in all (AND) or any (OR) any of the provided books.
* @param {string} [internal] true or false. If only internal recipes should be returned or not. * @param {string} [internal] true or false. If only internal recipes should be returned or not.
* @param {string} [random] true or false. returns the results in randomized order. * @param {string} [random] true or false. returns the results in randomized order.
* @param {string} [_new] true or false. returns new results first in search results
* @param {number} [page] A page number within the paginated result set. * @param {number} [page] A page number within the paginated result set.
* @param {number} [pageSize] Number of results to return per page. * @param {number} [pageSize] Number of results to return per page.
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
*/ */
listRecipes: async (query?: string, keywords?: string, foods?: string, books?: string, keywordsOr?: string, foodsOr?: string, booksOr?: string, internal?: string, random?: string, page?: number, pageSize?: number, options: any = {}): Promise<RequestArgs> => { listRecipes: async (query?: string, keywords?: string, foods?: string, books?: string, keywordsOr?: string, foodsOr?: string, booksOr?: string, internal?: string, random?: string, _new?: string, page?: number, pageSize?: number, options: any = {}): Promise<RequestArgs> => {
const localVarPath = `/api/recipe/`; const localVarPath = `/api/recipe/`;
// use dummy base URL string because the URL constructor only accepts absolute URLs. // use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
@ -4247,6 +4248,10 @@ export const ApiApiAxiosParamCreator = function (configuration?: Configuration)
localVarQueryParameter['random'] = random; localVarQueryParameter['random'] = random;
} }
if (_new !== undefined) {
localVarQueryParameter['new'] = _new;
}
if (page !== undefined) { if (page !== undefined) {
localVarQueryParameter['page'] = page; localVarQueryParameter['page'] = page;
} }
@ -8071,13 +8076,14 @@ export const ApiApiFp = function(configuration?: Configuration) {
* @param {string} [booksOr] If recipe should be in all (AND) or any (OR) any of the provided books. * @param {string} [booksOr] If recipe should be in all (AND) or any (OR) any of the provided books.
* @param {string} [internal] true or false. If only internal recipes should be returned or not. * @param {string} [internal] true or false. If only internal recipes should be returned or not.
* @param {string} [random] true or false. returns the results in randomized order. * @param {string} [random] true or false. returns the results in randomized order.
* @param {string} [_new] true or false. returns new results first in search results
* @param {number} [page] A page number within the paginated result set. * @param {number} [page] A page number within the paginated result set.
* @param {number} [pageSize] Number of results to return per page. * @param {number} [pageSize] Number of results to return per page.
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
*/ */
async listRecipes(query?: string, keywords?: string, foods?: string, books?: string, keywordsOr?: string, foodsOr?: string, booksOr?: string, internal?: string, random?: string, page?: number, pageSize?: number, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<InlineResponse2001>> { async listRecipes(query?: string, keywords?: string, foods?: string, books?: string, keywordsOr?: string, foodsOr?: string, booksOr?: string, internal?: string, random?: string, _new?: string, page?: number, pageSize?: number, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<InlineResponse2001>> {
const localVarAxiosArgs = await localVarAxiosParamCreator.listRecipes(query, keywords, foods, books, keywordsOr, foodsOr, booksOr, internal, random, page, pageSize, options); const localVarAxiosArgs = await localVarAxiosParamCreator.listRecipes(query, keywords, foods, books, keywordsOr, foodsOr, booksOr, internal, random, _new, page, pageSize, options);
return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration);
}, },
/** /**
@ -9584,13 +9590,14 @@ export const ApiApiFactory = function (configuration?: Configuration, basePath?:
* @param {string} [booksOr] If recipe should be in all (AND) or any (OR) any of the provided books. * @param {string} [booksOr] If recipe should be in all (AND) or any (OR) any of the provided books.
* @param {string} [internal] true or false. If only internal recipes should be returned or not. * @param {string} [internal] true or false. If only internal recipes should be returned or not.
* @param {string} [random] true or false. returns the results in randomized order. * @param {string} [random] true or false. returns the results in randomized order.
* @param {string} [_new] true or false. returns new results first in search results
* @param {number} [page] A page number within the paginated result set. * @param {number} [page] A page number within the paginated result set.
* @param {number} [pageSize] Number of results to return per page. * @param {number} [pageSize] Number of results to return per page.
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
*/ */
listRecipes(query?: string, keywords?: string, foods?: string, books?: string, keywordsOr?: string, foodsOr?: string, booksOr?: string, internal?: string, random?: string, page?: number, pageSize?: number, options?: any): AxiosPromise<InlineResponse2001> { listRecipes(query?: string, keywords?: string, foods?: string, books?: string, keywordsOr?: string, foodsOr?: string, booksOr?: string, internal?: string, random?: string, _new?: string, page?: number, pageSize?: number, options?: any): AxiosPromise<InlineResponse2001> {
return localVarFp.listRecipes(query, keywords, foods, books, keywordsOr, foodsOr, booksOr, internal, random, page, pageSize, options).then((request) => request(axios, basePath)); return localVarFp.listRecipes(query, keywords, foods, books, keywordsOr, foodsOr, booksOr, internal, random, _new, page, pageSize, options).then((request) => request(axios, basePath));
}, },
/** /**
* *
@ -11123,14 +11130,15 @@ export class ApiApi extends BaseAPI {
* @param {string} [booksOr] If recipe should be in all (AND) or any (OR) any of the provided books. * @param {string} [booksOr] If recipe should be in all (AND) or any (OR) any of the provided books.
* @param {string} [internal] true or false. If only internal recipes should be returned or not. * @param {string} [internal] true or false. If only internal recipes should be returned or not.
* @param {string} [random] true or false. returns the results in randomized order. * @param {string} [random] true or false. returns the results in randomized order.
* @param {string} [_new] true or false. returns new results first in search results
* @param {number} [page] A page number within the paginated result set. * @param {number} [page] A page number within the paginated result set.
* @param {number} [pageSize] Number of results to return per page. * @param {number} [pageSize] Number of results to return per page.
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
* @memberof ApiApi * @memberof ApiApi
*/ */
public listRecipes(query?: string, keywords?: string, foods?: string, books?: string, keywordsOr?: string, foodsOr?: string, booksOr?: string, internal?: string, random?: string, page?: number, pageSize?: number, options?: any) { public listRecipes(query?: string, keywords?: string, foods?: string, books?: string, keywordsOr?: string, foodsOr?: string, booksOr?: string, internal?: string, random?: string, _new?: string, page?: number, pageSize?: number, options?: any) {
return ApiApiFp(this.configuration).listRecipes(query, keywords, foods, books, keywordsOr, foodsOr, booksOr, internal, random, page, pageSize, options).then((request) => request(this.axios, this.basePath)); return ApiApiFp(this.configuration).listRecipes(query, keywords, foods, books, keywordsOr, foodsOr, booksOr, internal, random, _new, page, pageSize, options).then((request) => request(this.axios, this.basePath));
} }
/** /**