7 gadi atpakaļ normalize-package-data 11e3a9652a first 7 gadi atpakaļ normalize-path 11e3a9652a first 7 gadi atpakaļ normalize-range 11e3a9652a first 7 gadi atpakaļ normalize-url 11e3a9652a first 7 gadi atpakaļ normalize-wheel 11e3a9652a first 7 gadi atpakaļ npm-run-path 11e3a9652a first 7 gadi atpakaļ npmlog 11e3a9652a first 7 gadi atpakaļ nth-check 11e3a9652a first 7 gadi atpakaļ num2fraction 11e3a9652a first 7 gadi atpakaļ number-is-nan 11e3a9652a first 7 gadi atpakaļ nwmatcher 11e3a9652a first 7 gadi atpakaļ oauth-sign 11e3a9652a first 7 gadi atpakaļ object-assign 11e3a9652a first 7 gadi atpakaļ object-copy 11e3a9652a first 7 gadi atpakaļ object-hash 11e3a9652a first 7 gadi atpakaļ object-keys 11e3a9652a first 7 gadi atpakaļ object-visit 11e3a9652a first 7 gadi atpakaļ object.getownpropertydescriptors 11e3a9652a first 7 gadi atpakaļ object.omit 11e3a9652a first 7 gadi atpakaļ object.pick 11e3a9652a first 7 gadi atpakaļ obuf 11e3a9652a first 7 gadi atpakaļ on-finished 11e3a9652a first 7 gadi atpakaļ on-headers 11e3a9652a first 7 gadi atpakaļ once 11e3a9652a first 7 gadi atpakaļ onetime 11e3a9652a first 7 gadi atpakaļ opener 11e3a9652a first 7 gadi atpakaļ opn 11e3a9652a first 7 gadi atpakaļ optimist 11e3a9652a first 7 gadi atpakaļ optimize-css-assets-webpack-plugin 11e3a9652a first 7 gadi atpakaļ optionator 11e3a9652a first 7 gadi atpakaļ ora 11e3a9652a first 7 gadi atpakaļ original 11e3a9652a first 7 gadi atpakaļ os-browserify 11e3a9652a first 7 gadi atpakaļ os-homedir 11e3a9652a first 7 gadi atpakaļ os-locale 11e3a9652a first 7 gadi atpakaļ os-tmpdir 11e3a9652a first 7 gadi atpakaļ osenv 11e3a9652a first 7 gadi atpakaļ p-finally 11e3a9652a first 7 gadi atpakaļ p-limit 11e3a9652a first 7 gadi atpakaļ p-locate 11e3a9652a first 7 gadi atpakaļ p-map 11e3a9652a first 7 gadi atpakaļ p-try 11e3a9652a first 7 gadi atpakaļ pac-proxy-agent 11e3a9652a first 7 gadi atpakaļ pac-resolver 11e3a9652a first 7 gadi atpakaļ pako 11e3a9652a first 7 gadi atpakaļ parallel-transform 11e3a9652a first 7 gadi atpakaļ param-case 11e3a9652a first 7 gadi atpakaļ parse-asn1 11e3a9652a first 7 gadi atpakaļ parse-glob 11e3a9652a first 7 gadi atpakaļ parse-json 11e3a9652a first 7 gadi atpakaļ parse5 11e3a9652a first 7 gadi atpakaļ parseurl 11e3a9652a first 7 gadi atpakaļ pascalcase 11e3a9652a first 7 gadi atpakaļ path-browserify 11e3a9652a first 7 gadi atpakaļ path-dirname 11e3a9652a first 7 gadi atpakaļ path-exists 11e3a9652a first 7 gadi atpakaļ path-is-absolute 11e3a9652a first 7 gadi atpakaļ path-is-inside 11e3a9652a first 7 gadi atpakaļ path-key 11e3a9652a first 7 gadi atpakaļ path-parse 11e3a9652a first 7 gadi atpakaļ path-to-regexp 11e3a9652a first 7 gadi atpakaļ path-type 11e3a9652a first 7 gadi atpakaļ pbkdf2 11e3a9652a first 7 gadi atpakaļ pend 11e3a9652a first 7 gadi atpakaļ performance-now 11e3a9652a first 7 gadi atpakaļ pify 11e3a9652a first 7 gadi atpakaļ pinkie 11e3a9652a first 7 gadi atpakaļ pinkie-promise 11e3a9652a first 7 gadi atpakaļ pkg-dir 11e3a9652a first 7 gadi atpakaļ pluralize 11e3a9652a first 7 gadi atpakaļ pn 11e3a9652a first 7 gadi atpakaļ portfinder 11e3a9652a first 7 gadi atpakaļ posix-character-classes 11e3a9652a first 7 gadi atpakaļ postcss 11e3a9652a first 7 gadi atpakaļ postcss-calc 11e3a9652a first 7 gadi atpakaļ postcss-colormin 11e3a9652a first 7 gadi atpakaļ postcss-convert-values 11e3a9652a first 7 gadi atpakaļ postcss-discard-comments 11e3a9652a first 7 gadi atpakaļ postcss-discard-duplicates 11e3a9652a first 7 gadi atpakaļ postcss-discard-empty 11e3a9652a first 7 gadi atpakaļ postcss-discard-overridden 11e3a9652a first 7 gadi atpakaļ postcss-discard-unused 11e3a9652a first 7 gadi atpakaļ postcss-filter-plugins 11e3a9652a first 7 gadi atpakaļ postcss-import 11e3a9652a first 7 gadi atpakaļ postcss-load-config 11e3a9652a first 7 gadi atpakaļ postcss-load-options 11e3a9652a first 7 gadi atpakaļ postcss-load-plugins 11e3a9652a first 7 gadi atpakaļ postcss-loader 11e3a9652a first 7 gadi atpakaļ postcss-merge-idents 11e3a9652a first 7 gadi atpakaļ postcss-merge-longhand 11e3a9652a first 7 gadi atpakaļ postcss-merge-rules 11e3a9652a first 7 gadi atpakaļ postcss-message-helpers 11e3a9652a first 7 gadi atpakaļ postcss-minify-font-values 11e3a9652a first 7 gadi atpakaļ postcss-minify-gradients 11e3a9652a first 7 gadi atpakaļ postcss-minify-params 11e3a9652a first 7 gadi atpakaļ postcss-minify-selectors 11e3a9652a first 7 gadi atpakaļ postcss-modules-extract-imports 11e3a9652a first 7 gadi atpakaļ postcss-modules-local-by-default 11e3a9652a first 7 gadi atpakaļ postcss-modules-scope 11e3a9652a first 7 gadi atpakaļ postcss-modules-values 11e3a9652a first 7 gadi atpakaļ postcss-normalize-charset 11e3a9652a first 7 gadi atpakaļ postcss-normalize-url 11e3a9652a first 7 gadi atpakaļ postcss-ordered-values 11e3a9652a first 7 gadi atpakaļ postcss-reduce-idents 11e3a9652a first 7 gadi atpakaļ postcss-reduce-initial 11e3a9652a first 7 gadi atpakaļ postcss-reduce-transforms 11e3a9652a first 7 gadi atpakaļ postcss-selector-parser 11e3a9652a first 7 gadi atpakaļ postcss-svgo 11e3a9652a first 7 gadi atpakaļ postcss-unique-selectors 11e3a9652a first 7 gadi atpakaļ postcss-url 11e3a9652a first 7 gadi atpakaļ postcss-value-parser 11e3a9652a first 7 gadi atpakaļ postcss-zindex 11e3a9652a first 7 gadi atpakaļ prelude-ls 11e3a9652a first 7 gadi atpakaļ prepend-http 11e3a9652a first 7 gadi atpakaļ preserve 11e3a9652a first 7 gadi atpakaļ prettier 11e3a9652a first 7 gadi atpakaļ pretty 11e3a9652a first 7 gadi atpakaļ pretty-error 11e3a9652a first 7 gadi atpakaļ pretty-format 11e3a9652a first 7 gadi atpakaļ private 11e3a9652a first 7 gadi atpakaļ process 11e3a9652a first 7 gadi atpakaļ process-nextick-args 11e3a9652a first 7 gadi atpakaļ progress 11e3a9652a first 7 gadi atpakaļ promise-inflight 11e3a9652a first 7 gadi atpakaļ proto-list 11e3a9652a first 7 gadi atpakaļ proxy-addr 11e3a9652a first 7 gadi atpakaļ proxy-agent 11e3a9652a first 7 gadi atpakaļ prr 11e3a9652a first 7 gadi atpakaļ pseudomap 11e3a9652a first 7 gadi atpakaļ public-encrypt 11e3a9652a first 7 gadi atpakaļ pump 11e3a9652a first 7 gadi atpakaļ pumpify 11e3a9652a first 7 gadi atpakaļ punycode 11e3a9652a first 7 gadi atpakaļ q 11e3a9652a first 7 gadi atpakaļ qrcodejs2 11e3a9652a first 7 gadi atpakaļ qs 11e3a9652a first 7 gadi atpakaļ query-string 11e3a9652a first 7 gadi atpakaļ querystring 11e3a9652a first 7 gadi atpakaļ querystring-es3 11e3a9652a first 7 gadi atpakaļ querystringify 11e3a9652a first 7 gadi atpakaļ randomatic 11e3a9652a first 7 gadi atpakaļ randombytes 11e3a9652a first 7 gadi atpakaļ randomfill 11e3a9652a first 7 gadi atpakaļ range-parser 11e3a9652a first 7 gadi atpakaļ raw-body 11e3a9652a first 7 gadi atpakaļ read-cache 11e3a9652a first 7 gadi atpakaļ read-pkg 11e3a9652a first 7 gadi atpakaļ read-pkg-up 11e3a9652a first 7 gadi atpakaļ readable-stream 11e3a9652a first 7 gadi atpakaļ readdirp 11e3a9652a first 7 gadi atpakaļ realpath-native 11e3a9652a first 7 gadi atpakaļ rechoir 11e3a9652a first 7 gadi atpakaļ redent 11e3a9652a first 7 gadi atpakaļ reduce-css-calc 11e3a9652a first 7 gadi atpakaļ reduce-function-call 11e3a9652a first 7 gadi atpakaļ regenerate 11e3a9652a first 7 gadi atpakaļ regenerator-runtime 11e3a9652a first 7 gadi atpakaļ regenerator-transform 11e3a9652a first 7 gadi atpakaļ regex-cache 11e3a9652a first 7 gadi atpakaļ regex-not 11e3a9652a first 7 gadi atpakaļ regexpp 11e3a9652a first 7 gadi atpakaļ regexpu-core 11e3a9652a first 7 gadi atpakaļ regjsgen 11e3a9652a first 7 gadi atpakaļ regjsparser 11e3a9652a first 7 gadi atpakaļ relateurl 11e3a9652a first 7 gadi atpakaļ remove-trailing-separator 11e3a9652a first 7 gadi atpakaļ renderkid 11e3a9652a first 7 gadi atpakaļ repeat-element 11e3a9652a first 7 gadi atpakaļ repeat-string 11e3a9652a first 7 gadi atpakaļ repeating 11e3a9652a first 7 gadi atpakaļ request 11e3a9652a first 7 gadi atpakaļ request-promise-core 11e3a9652a first 7 gadi atpakaļ request-promise-native 11e3a9652a first 7 gadi atpakaļ require-directory 11e3a9652a first 7 gadi atpakaļ require-from-string 11e3a9652a first 7 gadi atpakaļ require-main-filename 11e3a9652a first 7 gadi atpakaļ require-uncached 11e3a9652a first 7 gadi atpakaļ requires-port 11e3a9652a first 7 gadi atpakaļ resize-observer-polyfill 11e3a9652a first 7 gadi atpakaļ resolve 11e3a9652a first 7 gadi atpakaļ resolve-cwd 11e3a9652a first 7 gadi atpakaļ resolve-from 11e3a9652a first 7 gadi atpakaļ resolve-url 11e3a9652a first 7 gadi atpakaļ restore-cursor 11e3a9652a first 7 gadi atpakaļ ret 11e3a9652a first 7 gadi atpakaļ right-align 11e3a9652a first 7 gadi atpakaļ rimraf 11e3a9652a first 7 gadi atpakaļ ripemd160 11e3a9652a first 7 gadi atpakaļ run-async 11e3a9652a first 7 gadi atpakaļ run-queue 11e3a9652a first 7 gadi atpakaļ rx-lite 11e3a9652a first 7 gadi atpakaļ rx-lite-aggregates 11e3a9652a first 7 gadi atpakaļ safe-buffer 11e3a9652a first 7 gadi atpakaļ safe-regex 11e3a9652a first 7 gadi atpakaļ safer-buffer 11e3a9652a first 7 gadi atpakaļ sane 11e3a9652a first 7 gadi atpakaļ sass-graph 11e3a9652a first 7 gadi atpakaļ sass-loader 11e3a9652a first 7 gadi atpakaļ sax 11e3a9652a first 7 gadi atpakaļ schema-utils 11e3a9652a first 7 gadi atpakaļ scss-tokenizer 11e3a9652a first 7 gadi atpakaļ select-hose 11e3a9652a first 7 gadi atpakaļ selenium-server 11e3a9652a first 7 gadi atpakaļ selfsigned 11e3a9652a first 7 gadi atpakaļ semver 11e3a9652a first 7 gadi atpakaļ send 11e3a9652a first 7 gadi atpakaļ serialize-javascript 11e3a9652a first 7 gadi atpakaļ serve-index 11e3a9652a first 7 gadi atpakaļ serve-static 11e3a9652a first 7 gadi atpakaļ set-blocking 11e3a9652a first 7 gadi atpakaļ set-immediate-shim 11e3a9652a first 7 gadi atpakaļ set-value 11e3a9652a first 7 gadi atpakaļ setimmediate 11e3a9652a first 7 gadi atpakaļ setprototypeof 11e3a9652a first 7 gadi atpakaļ sha.js 11e3a9652a first 7 gadi atpakaļ shallow-clone 11e3a9652a first 7 gadi atpakaļ shebang-command 11e3a9652a first 7 gadi atpakaļ shebang-regex 11e3a9652a first 7 gadi atpakaļ shelljs 11e3a9652a first 7 gadi atpakaļ shellwords 11e3a9652a first 7 gadi atpakaļ sigmund 11e3a9652a first 7 gadi atpakaļ signal-exit 11e3a9652a first 7 gadi atpakaļ slash 11e3a9652a first 7 gadi atpakaļ slice-ansi 11e3a9652a first 7 gadi atpakaļ smart-buffer 11e3a9652a first 7 gadi atpakaļ snapdragon 11e3a9652a first 7 gadi atpakaļ snapdragon-node 11e3a9652a first 7 gadi atpakaļ snapdragon-util 11e3a9652a first 7 gadi atpakaļ sntp 11e3a9652a first 7 gadi atpakaļ sockjs 11e3a9652a first 7 gadi atpakaļ sockjs-client 11e3a9652a first 7 gadi atpakaļ socks 11e3a9652a first 7 gadi atpakaļ socks-proxy-agent 11e3a9652a first 7 gadi atpakaļ sort-keys 11e3a9652a first 7 gadi atpakaļ source-list-map 11e3a9652a first 7 gadi atpakaļ source-map 11e3a9652a first 7 gadi atpakaļ source-map-resolve 11e3a9652a first 7 gadi atpakaļ source-map-support 11e3a9652a first 7 gadi atpakaļ source-map-url 11e3a9652a first 7 gadi atpakaļ spdx-correct 11e3a9652a first 7 gadi atpakaļ spdx-exceptions 11e3a9652a first 7 gadi atpakaļ spdx-expression-parse 11e3a9652a first 7 gadi atpakaļ spdx-license-ids 11e3a9652a first 7 gadi atpakaļ spdy 11e3a9652a first 7 gadi atpakaļ spdy-transport 11e3a9652a first 7 gadi atpakaļ split-string 11e3a9652a first 7 gadi atpakaļ sprintf-js 11e3a9652a first 7 gadi atpakaļ sshpk 11e3a9652a first 7 gadi atpakaļ ssri 11e3a9652a first 7 gadi atpakaļ stack-utils 11e3a9652a first 7 gadi atpakaļ stackframe 11e3a9652a first 7 gadi atpakaļ static-extend 11e3a9652a first 7 gadi atpakaļ statuses 11e3a9652a first 7 gadi atpakaļ stdout-stream 11e3a9652a first 7 gadi atpakaļ stealthy-require 11e3a9652a first 7 gadi atpakaļ stream-browserify 11e3a9652a first 7 gadi atpakaļ stream-each 11e3a9652a first 7 gadi atpakaļ stream-http 11e3a9652a first 7 gadi atpakaļ stream-shift 11e3a9652a first 7 gadi atpakaļ strict-uri-encode 11e3a9652a first 7 gadi atpakaļ string-length 11e3a9652a first 7 gadi atpakaļ string-width 11e3a9652a first 7 gadi atpakaļ string_decoder 11e3a9652a first 7 gadi atpakaļ stringstream 11e3a9652a first 7 gadi atpakaļ strip-ansi 11e3a9652a first 7 gadi atpakaļ strip-bom 11e3a9652a first 7 gadi atpakaļ strip-eof 11e3a9652a first 7 gadi atpakaļ strip-indent 11e3a9652a first 7 gadi atpakaļ strip-json-comments 11e3a9652a first 7 gadi atpakaļ supports-color 11e3a9652a first 7 gadi atpakaļ svg-tags 11e3a9652a first 7 gadi atpakaļ svgo 11e3a9652a first 7 gadi atpakaļ symbol-tree 11e3a9652a first 7 gadi atpakaļ table 11e3a9652a first 7 gadi atpakaļ tapable 11e3a9652a first 7 gadi atpakaļ tar 11e3a9652a first 7 gadi atpakaļ test-exclude 11e3a9652a first 7 gadi atpakaļ text-table 11e3a9652a first 7 gadi atpakaļ throat 11e3a9652a first 7 gadi atpakaļ throttle-debounce 11e3a9652a first 7 gadi atpakaļ through 11e3a9652a first 7 gadi atpakaļ through2 11e3a9652a first 7 gadi atpakaļ thunkify 11e3a9652a first 7 gadi atpakaļ thunky 11e3a9652a first 7 gadi atpakaļ time-stamp 11e3a9652a first 7 gadi atpakaļ timers-browserify 11e3a9652a first 7 gadi atpakaļ tmp 11e3a9652a first 7 gadi atpakaļ tmpl 11e3a9652a first 7 gadi atpakaļ to-arraybuffer 11e3a9652a first 7 gadi atpakaļ to-fast-properties 11e3a9652a first 7 gadi atpakaļ to-object-path 11e3a9652a first 7 gadi atpakaļ to-regex 11e3a9652a first 7 gadi atpakaļ to-regex-range 11e3a9652a first 7 gadi atpakaļ toposort 11e3a9652a first 7 gadi atpakaļ tough-cookie 11e3a9652a first 7 gadi atpakaļ tr46 11e3a9652a first 7 gadi atpakaļ trim-newlines 11e3a9652a first 7 gadi atpakaļ trim-right 11e3a9652a first 7 gadi atpakaļ true-case-path 11e3a9652a first 7 gadi atpakaļ tryer 11e3a9652a first 7 gadi atpakaļ tsconfig 11e3a9652a first 7 gadi atpakaļ tty-browserify 11e3a9652a first 7 gadi atpakaļ tunnel-agent 11e3a9652a first 7 gadi atpakaļ tweetnacl 11e3a9652a first 7 gadi atpakaļ type-check 11e3a9652a first 7 gadi atpakaļ type-detect 11e3a9652a first 7 gadi atpakaļ type-is 11e3a9652a first 7 gadi atpakaļ typedarray 11e3a9652a first 7 gadi atpakaļ uglify-js 11e3a9652a first 7 gadi atpakaļ uglify-to-browserify 11e3a9652a first 7 gadi atpakaļ uglifyjs-webpack-plugin 11e3a9652a first 7 gadi atpakaļ union-value 11e3a9652a first 7 gadi atpakaļ uniq 11e3a9652a first 7 gadi atpakaļ uniqid 11e3a9652a first 7 gadi atpakaļ uniqs 11e3a9652a first 7 gadi atpakaļ unique-filename 11e3a9652a first 7 gadi atpakaļ unique-slug 11e3a9652a first 7 gadi atpakaļ unpipe 11e3a9652a first 7 gadi atpakaļ unset-value 11e3a9652a first 7 gadi atpakaļ upath 11e3a9652a first 7 gadi atpakaļ upper-case 11e3a9652a first 7 gadi atpakaļ uri-js 11e3a9652a first 7 gadi atpakaļ urix 11e3a9652a first 7 gadi atpakaļ url 11e3a9652a first 7 gadi atpakaļ url-loader 11e3a9652a first 7 gadi atpakaļ url-parse 11e3a9652a first 7 gadi atpakaļ use 11e3a9652a first 7 gadi atpakaļ util 11e3a9652a first 7 gadi atpakaļ util-deprecate 11e3a9652a first 7 gadi atpakaļ util.promisify 11e3a9652a first 7 gadi atpakaļ utila 11e3a9652a first 7 gadi atpakaļ utils-merge 11e3a9652a first 7 gadi atpakaļ uuid 11e3a9652a first 7 gadi atpakaļ validate-npm-package-license 11e3a9652a first 7 gadi atpakaļ vary 11e3a9652a first 7 gadi atpakaļ vendors 11e3a9652a first 7 gadi atpakaļ verror 11e3a9652a first 7 gadi atpakaļ vm-browserify 11e3a9652a first 7 gadi atpakaļ vue 11e3a9652a first 7 gadi atpakaļ vue-eslint-parser 11e3a9652a first 7 gadi atpakaļ vue-hot-reload-api 11e3a9652a first 7 gadi atpakaļ vue-jest 11e3a9652a first 7 gadi atpakaļ vue-loader 11e3a9652a first 7 gadi atpakaļ vue-router 11e3a9652a first 7 gadi atpakaļ vue-style-loader 11e3a9652a first 7 gadi atpakaļ vue-template-compiler 11e3a9652a first 7 gadi atpakaļ vue-template-es2015-compiler 11e3a9652a first 7 gadi atpakaļ w3c-hr-time 11e3a9652a first 7 gadi atpakaļ walker 11e3a9652a first 7 gadi atpakaļ watch 11e3a9652a first 7 gadi atpakaļ watchpack 11e3a9652a first 7 gadi atpakaļ wbuf 11e3a9652a first 7 gadi atpakaļ webidl-conversions 11e3a9652a first 7 gadi atpakaļ webpack 11e3a9652a first 7 gadi atpakaļ webpack-bundle-analyzer 11e3a9652a first 7 gadi atpakaļ webpack-dev-middleware 11e3a9652a first 7 gadi atpakaļ webpack-dev-server 11e3a9652a first 7 gadi atpakaļ webpack-merge 11e3a9652a first 7 gadi atpakaļ webpack-sources 11e3a9652a first 7 gadi atpakaļ websocket-driver 11e3a9652a first 7 gadi atpakaļ websocket-extensions 11e3a9652a first 7 gadi atpakaļ whatwg-encoding 11e3a9652a first 7 gadi atpakaļ whatwg-mimetype 11e3a9652a first 7 gadi atpakaļ whatwg-url 11e3a9652a first 7 gadi atpakaļ whet.extend 11e3a9652a first 7 gadi atpakaļ which 11e3a9652a first 7 gadi atpakaļ which-module 11e3a9652a first 7 gadi atpakaļ wide-align 11e3a9652a first 7 gadi atpakaļ window-size 11e3a9652a first 7 gadi atpakaļ wordwrap 11e3a9652a first 7 gadi atpakaļ worker-farm 11e3a9652a first 7 gadi atpakaļ wrap-ansi 11e3a9652a first 7 gadi atpakaļ wrappy 11e3a9652a first 7 gadi atpakaļ write 11e3a9652a first 7 gadi atpakaļ write-file-atomic 11e3a9652a first 7 gadi atpakaļ ws 11e3a9652a first 7 gadi atpakaļ xml-name-validator 11e3a9652a first 7 gadi atpakaļ xregexp 11e3a9652a first 7 gadi atpakaļ xtend 11e3a9652a first 7 gadi atpakaļ xxhashjs 11e3a9652a first 7 gadi atpakaļ y18n 11e3a9652a first 7 gadi atpakaļ yallist 11e3a9652a first 7 gadi atpakaļ yargs 11e3a9652a first 7 gadi atpakaļ yargs-parser 11e3a9652a first 7 gadi atpakaļ yauzl 11e3a9652a first 7 gadi atpakaļ zrender 11e3a9652a first 7 gadi atpakaļ add api lensman_login_api/lensman_upload_photo_api · d3fd6adf70 - Gogs: Go Git Service

add api lensman_login_api/lensman_upload_photo_api

Brightcells 9 anos atrás
pai
commit
d3fd6adf70
5 arquivos alterados com 212 adições e 5 exclusões
  1. 2 0
      account/models.py
  2. 9 1
      api/urls.py
  3. 1 1
      group/admin.py
  4. 199 0
      group/lensman_views.py
  5. 1 3
      photo/views.py

+ 2 - 0
account/models.py

@@ -176,6 +176,8 @@ class UserInfo(CreateUpdateMixin):
176 176
             return self.nickname
177 177
         elif self.user_from == self.GUEST_USER:
178 178
             return self.nickname
179
+        elif self.user_from == self.LENSMAN_USER:
180
+            return self.name
179 181
         return self.nickname
180 182
 
181 183
     @property

+ 9 - 1
api/urls.py

@@ -4,6 +4,7 @@ from django.conf.urls import url
4 4
 
5 5
 from account import views as account_views
6 6
 from group import views as group_views
7
+from group import lensman_views
7 8
 from message import views as message_views
8 9
 from operation import views as op_views
9 10
 from pay import views as pay_views
@@ -24,6 +25,12 @@ urlpatterns = [
24 25
     url(r'^u/guest/login$', account_views.guest_login_api, name='guest_login_api'),  # 游客登录
25 26
 ]
26 27
 
28
+# 摄影师相关
29
+urlpatterns += [
30
+    url(r'^l/login$', lensman_views.lensman_login_api, name='lensman_login_api'),  # 摄影师登录
31
+    url(r'^l/photos/upload$', lensman_views.lensman_upload_photo_api, name='lensman_upload_photo_api'),  # 摄影师上传照片
32
+]
33
+
27 34
 # 群组相关
28 35
 urlpatterns += [
29 36
     url(r'^g/create$', group_views.group_create_api, name='group_create_api'),  # 群组创建
@@ -65,7 +72,8 @@ urlpatterns += [
65 72
 urlpatterns += [
66 73
     url(r'^uuid_init$', photo_views.uuid_init, name='uuid_init'),  # 生成唯一标识
67 74
     url(r'^uuid$', photo_views.uuid, name='uuid'),  # 获取唯一标识
68
-    url(r'^photos/upload$', photo_views.upload_photo, name='upload_photo'),  # 上传图片
75
+    url(r'^photos/upload$', photo_views.upload_photo, name='upload_photo'),  # 摄影师照片上传
76
+    # url(r'^photos/raw/upload$', photo_views.upload_raw_photo, name='upload_raw_photo'),  # 摄影师高清照片上传
69 77
 ]
70 78
 
71 79
 # 二维码相关

+ 1 - 1
group/admin.py

@@ -7,7 +7,7 @@ from group.models import (GroupInfo, GroupPhotoInfo, GroupPhotoOrderInfo, GroupU
7 7
 
8 8
 
9 9
 class GroupInfoAdmin(admin.ModelAdmin):
10
-    list_display = ('group_id', 'admin_id', 'group_name', 'group_desc', 'group_from', 'group_lock', 'status', 'created_at', 'updated_at')
10
+    list_display = ('group_id', 'admin_id', 'group_name', 'group_desc', 'group_from', 'session_id', 'group_lock', 'status', 'created_at', 'updated_at')
11 11
     list_filter = ('group_from', 'group_lock', 'status')
12 12
 
13 13
 

+ 199 - 0
group/lensman_views.py

@@ -0,0 +1,199 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+from __future__ import division
4
+
5
+import os
6
+
7
+import shortuuid
8
+from curtail_uuid import CurtailUUID
9
+from django.conf import settings
10
+from django.contrib.auth.hashers import check_password
11
+from django.core.files.storage import default_storage
12
+from django.http import JsonResponse
13
+from TimeConvert import TimeConvert as tc
14
+
15
+from account.models import LensmanInfo, UserInfo
16
+from group.models import GroupInfo, GroupPhotoInfo, GroupUserInfo
17
+from photo.models import PhotosInfo
18
+from utils.error.errno_utils import LensmanStatusCode, UserStatusCode
19
+from utils.error.response_utils import response
20
+from utils.redis.rgroup import get_group_info, get_group_users_info, set_group_info, set_group_users_info
21
+from utils.redis.rkeys import GROUP_LAST_PHOTO_PK
22
+from utils.thumbnail_utils import make_thumbnail
23
+from utils.watermark_utils import watermark_wrap
24
+
25
+
26
+r = settings.REDIS_CACHE
27
+
28
+
29
+def lensman_login_api(request):
30
+    """
31
+    摄影师登录
32
+    :param request:
33
+    :return:
34
+    """
35
+    username = request.POST.get('username', '')
36
+    password = request.POST.get('password', '')
37
+
38
+    try:
39
+        lensman = LensmanInfo.objects.get(username=username)
40
+    except LensmanInfo.DoesNotExist:
41
+        return response(LensmanStatusCode.LENSMAN_NOT_FOUND)
42
+
43
+    if not check_password(password, lensman.encryption):
44
+        return response(LensmanStatusCode.LENSMAN_PASSWORD_ERROR)
45
+
46
+    try:
47
+        user = UserInfo.objects.get(user_id=lensman.lensman_id)
48
+    except UserInfo.DoesNotExist:
49
+        return response(LensmanStatusCode.LENSMAN_NOT_FOUND)
50
+
51
+    return JsonResponse({
52
+        'status': 200,
53
+        'message': u'登录成功',
54
+        'data': user.data,
55
+    })
56
+
57
+
58
+def lensman_upload_photo_api(request):
59
+    """
60
+    摄影师上传照片
61
+    :param request:
62
+    :return:
63
+    """
64
+    user_id = lensman_id = request.POST.get('user_id', '')
65
+    nickname = request.POST.get('nickname', '')
66
+    session_id = request.POST.get('session', '')
67
+
68
+    photo_id = request.POST.get('photo_id', '')
69
+
70
+    photo = request.FILES.get('photo', '')
71
+
72
+    current_id = int(request.POST.get('current_id', -1))
73
+
74
+    # 用户校验
75
+    try:
76
+        user = UserInfo.objects.get(user_id=user_id)
77
+    except UserInfo.DoesNotExist:
78
+        return response(UserStatusCode.USER_NOT_FOUND)
79
+
80
+    # 判断通过 session_id 创建的群组是否存在,如果不存在,则直接创建
81
+    group, group_created = GroupInfo.objects.get_or_create(session_id=session_id, group_from=GroupInfo.SESSION_GROUP, defaults={
82
+        'group_id': CurtailUUID.uuid(GroupInfo, 'group_id'),
83
+        'admin_id': user_id,
84
+        'group_name': user.final_nickname,
85
+        'group_default_avatar': 0,
86
+    })
87
+    group_id = group.group_id
88
+
89
+    # Redis 群组数据缓存
90
+    group_info = set_group_info(group) if group_created else get_group_info(group_id)
91
+
92
+    # 判断 group_id/user_id 的群组用户是否存在,如果不存在,则直接创建
93
+    group_user_current_id = -1
94
+    group_user, group_user_created = GroupUserInfo.objects.get_or_create(group_id=group_id, user_id=user_id, defaults={
95
+        # 'current_id': int(r.get(GROUP_LAST_PHOTO_PK % group_id) or -1),
96
+        'current_id': group_user_current_id,  # 通过扫描 session_id 二维码进群的用户,默认可以查看该群组所有照片
97
+        'nickname': nickname or user.final_nickname,
98
+        'avatar': user.avatar,
99
+        'admin': group_created,
100
+        'user_status': GroupUserInfo.PASSED,
101
+        'passed_at': tc.utc_datetime(),
102
+    })
103
+    if not group_user_created:
104
+        group_user.current_id = group_user_current_id
105
+        group_user.user_status = GroupUserInfo.PASSED
106
+        group_user.save()
107
+
108
+    # Redis 群组用户数据缓存
109
+    group_users = set_group_users_info(group) if group_user_created else get_group_users_info(group_id, user_id)
110
+
111
+    if photo:
112
+        # 写 PhotosInfo 表
113
+        _, extension = os.path.splitext(photo.name)
114
+        extension = extension or 'jpeg'
115
+
116
+        m_photo_path = 'photo/{uuid}{extension}'.format(uuid=shortuuid.uuid(), extension=extension)
117
+
118
+        if default_storage.exists(m_photo_path):
119
+            default_storage.delete(m_photo_path)
120
+        default_storage.save(m_photo_path, photo)
121
+
122
+        p_photo_path = 'photo/{uuid}{extension}'.format(uuid=shortuuid.uuid(), extension=extension)
123
+        watermark_wrap(
124
+            os.path.join(settings.MEDIA_ROOT, m_photo_path).replace('\\', '/'),
125
+            settings.WATERMARK_LOGO,
126
+            os.path.join(settings.MEDIA_ROOT, p_photo_path).replace('\\', '/')
127
+        )
128
+
129
+        photo, created = PhotosInfo.objects.get_or_create(
130
+            lensman_id=lensman_id,
131
+            session_id=session_id,
132
+            photo_id=photo_id,
133
+            p_photo_path=p_photo_path,
134
+            m_photo_path=m_photo_path,
135
+        )
136
+
137
+        # 写 GroupPhotoInfo 表
138
+        photo_path = photo.p_photo_path
139
+        photo_thumbnail_path = photo_path.replace('.', '_thumbnail.')
140
+        photo_thumbnail2_path = photo_path.replace('.', '_thumbnail2.')
141
+
142
+        # 群组照片缩略图生成
143
+        # 双列: 540, 40-50K
144
+        photo_w, photo_h, photo_thumbnail_w, photo_thumbnail_h = make_thumbnail(
145
+            os.path.join(settings.MEDIA_ROOT, photo_path).replace('\\', '/'),
146
+            os.path.join(settings.MEDIA_ROOT, photo_thumbnail_path).replace('\\', '/'),
147
+            settings.THUMBNAIL_MAX_WIDTH
148
+        )
149
+
150
+        # 单列: 1080, xx-100K
151
+        photo_w, photo_h, photo_thumbnail2_w, photo_thumbnail2_h = make_thumbnail(
152
+            os.path.join(settings.MEDIA_ROOT, photo_path).replace('\\', '/'),
153
+            os.path.join(settings.MEDIA_ROOT, photo_thumbnail2_path).replace('\\', '/'),
154
+            settings.THUMBNAIL_MAX_WIDTH2
155
+        )
156
+
157
+        # 群组照片记录创建
158
+        group_photo = GroupPhotoInfo.objects.create(
159
+            group_id=group_id,
160
+            user_id=user_id,
161
+            nickname=user.final_nickname,
162
+            avatar=user.avatar,
163
+            photo_path=photo_path,
164
+            photo_w=photo_w,
165
+            photo_h=photo_h,
166
+            photo_thumbnail_path=photo_thumbnail_path,
167
+            photo_thumbnail_w=photo_thumbnail_w,
168
+            photo_thumbnail_h=photo_thumbnail_h,
169
+            photo_thumbnail2_path=photo_thumbnail2_path,
170
+            photo_thumbnail2_w=photo_thumbnail2_w,
171
+            photo_thumbnail2_h=photo_thumbnail2_h,
172
+            photo_from=GroupPhotoInfo.SESSION_GROUP,
173
+            session_id=photo.session_id,
174
+            lensman_id=photo.lensman_id,
175
+            lensman_photo_id=photo.photo_id,
176
+        )
177
+
178
+        # 设置群组最后一张照片PK
179
+        r.set(GROUP_LAST_PHOTO_PK % group_id, group_photo.pk)
180
+
181
+    # 获取从 current_id 到 now 的群组照片列表
182
+    group_photos = GroupPhotoInfo.objects.filter(
183
+        group_id=group_id,
184
+        status=True,
185
+        pk__gt=max(current_id, group_user.current_id),
186
+    ).order_by(
187
+        '-pk'
188
+    )
189
+    latest_photo = group_photos.first()
190
+
191
+    return JsonResponse({
192
+        'status': 200,
193
+        'message': u'摄影师照片上传成功',
194
+        'data': {
195
+            'group_id': group_id,
196
+            'current_id': latest_photo and latest_photo.pk or current_id,
197
+            'photos': [photo.photo_info(user_id) for photo in group_photos],
198
+        }
199
+    })

+ 1 - 3
photo/views.py

@@ -159,13 +159,11 @@ def session_join_api(request):
159 159
     user_id = user.user_id
160 160
 
161 161
     # 判断通过 session_id 创建的群组是否存在,如果不存在,则直接创建
162
-    group, group_created = GroupInfo.objects.get_or_create(session_id=session_id, defaults={
162
+    group, group_created = GroupInfo.objects.get_or_create(session_id=session_id, group_from=GroupInfo.SESSION_GROUP, defaults={
163 163
         'group_id': CurtailUUID.uuid(GroupInfo, 'group_id'),
164 164
         'admin_id': user_id,
165 165
         'group_name': user.final_nickname,
166 166
         'group_default_avatar': 0,
167
-        'group_from': GroupInfo.SESSION_GROUP,
168
-        'session_id': session_id,
169 167
     })
170 168
     group_id = group.group_id
171 169