All Files (89.92% covered at 1.84 hits/line)
62 files in total.
526 relevant lines.
473 lines covered and
53 lines missed
- 1
class AccountsController < ApplicationController
- 1
before_action :set_default
- 1
before_action :authenticate_parent!
- 1
before_action :parent_is_current_parent
- 1
def new
- 3
@account = Account.new
end
- 1
def create
- 3
@parent = @child.bank.parent
- 3
@account = Account.create(account_params)
- 3
@account.child = @child
- 3
@account.save
- 3
respond_to do |format|
- 3
format.html { redirect_to parent_bank_path(@parent, @bank)}
- 3
format.js
end
end
- 1
def show
- 1
@account = Account.find(params[:id])
- 1
@chart_data = @account.transactions.transaction_chart_data(@account)
- 1
@transactions = @account.transactions.search(params[:search]).order(created_at: :desc).paginate(page: params[:page], per_page: 10)
- 1
respond_to do |format|
- 1
format.html
- 1
format.js
end
end
- 1
private
- 1
def account_params
- 3
params.require(:account).permit(:beginning_balance)
end
- 1
def set_default
- 7
@child = Child.find(params[:child_id])
end
- 1
def parent_is_current_parent
- 7
unless current_parent.id == @child.parent.id
flash[:danger] = "You may only view accounts in your bank."
redirect_to root_path
end
end
end
- 1
class ApplicationController < ActionController::Base
- 1
before_action :configure_permitted_parameters, if: :devise_controller?
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
- 1
protect_from_forgery with: :exception
- 1
protected
- 1
def configure_permitted_parameters
- 26
devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:username, :email, :password, :password_confirmation, :first_name, :last_name) }
- 22
devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:login, :username, :email, :password) }
end
- 1
def after_sign_in_path_for(parent)
"/parents/#{parent.id}/banks/#{parent.bank.id}"
end
- 1
def after_sign_in_path_for(child)
'/'
end
end
- 1
class BanksController < ApplicationController
- 1
before_action :set_default
- 1
before_action :authenticate_parent!
- 1
before_action :parent_is_current_parent, except: [:new, :create]
- 1
def new
- 5
@bank = Bank.new
end
- 1
def create
- 5
@bank = Bank.new(bank_params)
- 5
@bank.parent = @parent
- 5
if @bank.save
- 5
flash[:success] = "Your bank was created!"
- 5
redirect_to parent_bank_path(@parent, @bank)
else
flash[:danger] = "Something went wrong."
redirect_to :back
end
end
- 1
def show
- 9
@bank = Bank.find(params[:id]) || Bank.find(params[:current_parent_id])
- 9
@children = @bank.children
- 9
@requests = @bank.parent.requests
- 13
@chart_children = @children.select {|child| child.account.present? == true}
end
- 1
private
- 1
def set_default
- 19
@parent = Parent.find(params[:parent_id])
end
- 1
def bank_params
- 5
params.require(:bank).permit(:name)
end
- 1
def parent_is_current_parent
- 9
unless current_parent.bank.id == params[:id].to_i
flash[:danger] = "You may only view your own bank."
redirect_to root_path
end
end
end
- 1
class Children::ConfirmationsController < Devise::ConfirmationsController
# GET /resource/confirmation/new
# def new
# super
# end
# POST /resource/confirmation
# def create
# super
# end
# GET /resource/confirmation?confirmation_token=abcdef
# def show
# super
# end
# protected
# The path used after resending confirmation instructions.
# def after_resending_confirmation_instructions_path_for(resource_name)
# super(resource_name)
# end
# The path used after confirmation.
# def after_confirmation_path_for(resource_name, resource)
# super(resource_name, resource)
# end
end
- 1
class Children::OmniauthCallbacksController < Devise::OmniauthCallbacksController
# You should configure your model like this:
# devise :omniauthable, omniauth_providers: [:twitter]
# You should also create an action method in this controller like this:
# def twitter
# end
# More info at:
# https://github.com/plataformatec/devise#omniauth
# GET|POST /resource/auth/twitter
# def passthru
# super
# end
# GET|POST /users/auth/twitter/callback
# def failure
# super
# end
# protected
# The path used when OmniAuth fails
# def after_omniauth_failure_path_for(scope)
# super(scope)
# end
end
- 1
class Children::PasswordsController < Devise::PasswordsController
# GET /resource/password/new
# def new
# super
# end
# POST /resource/password
# def create
# super
# end
# GET /resource/password/edit?reset_password_token=abcdef
# def edit
# super
# end
# PUT /resource/password
# def update
# super
# end
# protected
# def after_resetting_password_path_for(resource)
# super(resource)
# end
# The path used after sending reset password instructions
# def after_sending_reset_password_instructions_path_for(resource_name)
# super(resource_name)
# end
end
- 1
class Children::RegistrationsController < Devise::RegistrationsController
- 1
before_filter :configure_sign_up_params, only: [:create]
# before_action :set_default
# before_filter :configure_account_update_params, only: [:update]
# GET /resource/sign_up
# def new
# super
# end
# POST /resource
- 1
def create
- 4
@bank = Bank.find(sign_up_params[:bank_id])
- 4
@child = Child.new(sign_up_params)
- 4
@parent = @bank.parent
- 4
if @child.save
- 4
flash[:notice] = "Child added to bank"
- 4
redirect_to parent_bank_path(@parent, @bank)
else
flash[:notice] = "Something went wrong"
redirect_to :back
end
end
# GET /resource/edit
# def edit
# super
# end
# PUT /resource
# def update
# super
# end
# DELETE /resource
# def destroy
# super
# end
# GET /resource/cancel
# Forces the session data which is usually expired after sign
# in to be expired now. This is useful if the user wants to
# cancel oauth signing in/up in the middle of the process,
# removing all OAuth session data.
# def cancel
# super
# end
- 1
protected
# If you have extra params to permit, append them to the sanitizer.
- 1
def configure_sign_up_params
- 12
devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:username, :password, :password_confirmation, :first_name, :last_name, :bank_id) }
end
# If you have extra params to permit, append them to the sanitizer.
# def configure_account_update_params
# devise_parameter_sanitizer.for(:account_update) << :attribute
# end
# The path used after sign up.
- 1
def after_sign_up_path_for(child)
"banks/#{bank.id}"
end
# def set_default
# @bank = Bank.find(params[:bank])
# end
# The path used after sign up for inactive accounts.
# def after_inactive_sign_up_path_for(resource)
# super(resource)
# end
end
- 1
class Children::SessionsController < Devise::SessionsController
- 1
before_filter :configure_sign_in_params, only: [:create]
# GET /resource/sign_in
# def new
# super
# end
# POST /resource/sign_in
# def create
# super
# end
# DELETE /resource/sign_out
# def destroy
# super
# end
- 1
protected
# If you have extra params to permit, append them to the sanitizer.
- 1
def configure_sign_in_params
- 1
devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:login, :username, :password) }
end
- 1
def after_sign_in_path_for(child)
- 1
"/banks/#{child.bank.id}/children/#{child.id}"
end
end
- 1
class Children::UnlocksController < Devise::UnlocksController
# GET /resource/unlock/new
# def new
# super
# end
# POST /resource/unlock
# def create
# super
# end
# GET /resource/unlock?unlock_token=abcdef
# def show
# super
# end
# protected
# The path used after sending unlock password instructions
# def after_sending_unlock_instructions_path_for(resource)
# super(resource)
# end
# The path used after unlocking the resource
# def after_unlock_path_for(resource)
# super(resource)
# end
end
- 1
class ChildrenController < ApplicationController
- 1
before_action :authenticate_child!, except: [:destroy]
- 1
before_action :child_is_current_child, except: [:destroy]
- 1
before_action :parent_is_child_parent, only: [:destroy]
- 1
def show
- 1
@child = current_child
- 1
@account = @child.account
- 1
@bank = @child.bank
- 1
if @account
- 1
@transactions = @account.transactions.search(params[:search]).order(created_at: :desc).paginate(page: params[:page], per_page: 10)
- 1
@requests = @child.requests
- 1
@chart_data = @account.transactions.transaction_chart_data(@account)
- 1
respond_to do |format|
- 1
format.html
- 1
format.js
end
end
end
- 1
def destroy
@child = Child.find(params[:id])
if @child.destroy
flash[:success] = "Child deleted from bank."
redirect_to :back
else
flash[:danger] = "Something went wrong. Please try again."
redirect_to :back
end
end
- 1
private
- 1
def child_is_current_child
- 1
unless current_child.id == params[:id].to_i
flash[:danger] = "You may only view your own account."
redirect_to root_path
end
end
- 1
def parent_is_child_parent
@child = Child.find(params[:id])
unless @child.parent.id == params[:parent].to_i
flash[:danger] = "You may only view your own account."
redirect_to root_path
end
end
end
- 1
class Parents::ConfirmationsController < Devise::ConfirmationsController
# GET /resource/confirmation/new
# def new
# super
# end
# POST /resource/confirmation
# def create
# super
# end
# GET /resource/confirmation?confirmation_token=abcdef
# def show
# super
# end
# protected
# The path used after resending confirmation instructions.
# def after_resending_confirmation_instructions_path_for(resource_name)
# super(resource_name)
# end
# The path used after confirmation.
# def after_confirmation_path_for(resource_name, resource)
# super(resource_name, resource)
# end
end
- 1
class Parents::OmniauthCallbacksController < Devise::OmniauthCallbacksController
# You should configure your model like this:
# devise :omniauthable, omniauth_providers: [:twitter]
# You should also create an action method in this controller like this:
# def twitter
# end
# More info at:
# https://github.com/plataformatec/devise#omniauth
# GET|POST /resource/auth/twitter
# def passthru
# super
# end
# GET|POST /users/auth/twitter/callback
# def failure
# super
# end
# protected
# The path used when OmniAuth fails
# def after_omniauth_failure_path_for(scope)
# super(scope)
# end
end
- 1
class Parents::PasswordsController < Devise::PasswordsController
# GET /resource/password/new
# def new
# super
# end
# POST /resource/password
# def create
# super
# end
# GET /resource/password/edit?reset_password_token=abcdef
# def edit
# super
# end
# PUT /resource/password
# def update
# super
# end
# protected
# def after_resetting_password_path_for(resource)
# super(resource)
# end
# The path used after sending reset password instructions
# def after_sending_reset_password_instructions_path_for(resource_name)
# super(resource_name)
# end
end
- 1
class Parents::RegistrationsController < Devise::RegistrationsController
# before_filter :configure_sign_up_params, only: [:create]
# before_filter :configure_account_update_params, only: [:update]
# GET /resource/sign_up
- 1
def new
- 5
@parent = Parent.new
end
# POST /resource
- 1
def create
- 5
@parent = Parent.new(sign_up_params)
- 5
if @parent.save
- 5
sign_in(@parent)
- 5
redirect_to new_parent_bank_path(@parent)
else
redirect_to :back
end
end
# GET /resource/edit
# def edit
# super
# end
# PUT /resource
# def update
# super
# end
# DELETE /resource
# def destroy
# super
# end
# GET /resource/cancel
# Forces the session data which is usually expired after sign
# in to be expired now. This is useful if the user wants to
# cancel oauth signing in/up in the middle of the process,
# removing all OAuth session data.
# def cancel
# super
# end
- 1
protected
# If you have extra params to permit, append them to the sanitizer.
# def configure_sign_up_params
# devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:username, :email, :password, :password_confirmation, :first_name, :last_name) }
# end
# If you have extra params to permit, append them to the sanitizer.
# def configure_account_update_params
# devise_parameter_sanitizer.for(:account_update) << :attribute
# end
# The path used after sign up.
# def after_sign_up_path
#<EMAIL_ADDRESS># end
# The path used after sign up for inactive accounts.
# def after_inactive_sign_up_path_for(resource)
# super(resource)
# end
end
- 1
class Parents::SessionsController < Devise::SessionsController
# before_filter :configure_sign_in_params, only: [:create]
# GET /resource/sign_in
# def new
# super
# end
# POST /resource/sign_in
# def create
# super
# end
# DELETE /resource/sign_out
# def destroy
# super
# end
- 1
protected
- 1
def after_sign_in_path_for(parent)
if parent.bank
"/parents/#{parent.id}/banks/#{parent.bank.id}"
else
"/parents/#{parent.id}/banks/new"
end
end
# If you have extra params to permit, append them to the sanitizer.
# def configure_sign_in_params
# devise_parameter_sanitizer.for(:sign_in) << :attribute
# end
end
- 1
class Parents::UnlocksController < Devise::UnlocksController
# GET /resource/unlock/new
# def new
# super
# end
# POST /resource/unlock
# def create
# super
# end
# GET /resource/unlock?unlock_token=abcdef
# def show
# super
# end
# protected
# The path used after sending unlock password instructions
# def after_sending_unlock_instructions_path_for(resource)
# super(resource)
# end
# The path used after unlocking the resource
# def after_unlock_path_for(resource)
# super(resource)
# end
end
- 1
class RequestsController < ApplicationController
- 1
before_action :authenticate_child!
- 1
def new
- 1
@request = Request.new
- 1
@child = Child.find(params[:child])
- 1
@parent = Parent.find(params[:parent])
end
- 1
def create
- 1
@request = Request.create(request_params)
- 1
@child = Child.find(request_params[:child_id])
- 1
@bank = @child.bank
- 1
respond_to do |format|
- 1
format.html {redirect_to bank_child_path(@bank, @child)}
- 1
format.js
end
end
- 1
def destroy
@request = Request.find(params[:id])
@request.destroy
redirect_to :back
end
- 1
private
- 1
def request_params
- 2
params.require(:request).permit(:amount, :request_type, :description, :parent_id, :child_id)
end
end
- 1
class StaticPagesController < ApplicationController
- 1
def home
end
- 1
def help
end
- 1
def about
- 1
respond_to do |format|
- 1
format.html
- 1
format.js
end
end
end
- 1
class TransactionsController < ApplicationController
- 1
before_action :authenticate_parent!
- 1
before_action :set_default
- 1
def new
- 1
@transaction = Transaction.new
end
- 1
def create
- 1
if transaction_params[:transaction_type].=="Withdrawal"
amount = transaction_params[:amount].to_f.abs.*(-1)
else
- 1
amount = transaction_params[:amount].to_f
end
- 1
@transaction = Transaction.create(:description =>transaction_params[:description], :transaction_type => transaction_params[:transaction_type], :amount => amount, :bank_id => transaction_params[:bank_id] )
- 1
@transaction.account = @account
- 1
@transaction.save
- 1
@chart_data = @account.transactions.transaction_chart_data(@account)
- 1
if transaction_params[:request_id]
@request = Request.find(transaction_params[:request_id])
@request.destroy
redirect_to :back
else
- 1
respond_to do |format|
- 1
format.html {redirect_to<EMAIL_ADDRESS>@account)}
- 1
format.js
end
end
end
- 1
def show
end
- 1
private
- 1
def transaction_params
- 6
params.require(:transaction).permit(:amount, :transaction_type, :description, :request_id, :bank_id)
end
- 1
def set_default
- 2
@account = Account.find(params[:account_id])
end
end
- 1
module ApplicationHelper
end
- 1
module DeviseHelper
- 1
def devise_error_messages!
- 9
return '' if resource.errors.empty?
messages = resource.errors.full_messages.map { |msg| content_tag(:li, msg) }.join
html = <<-HTML
<div class="alert alert-error alert-danger"> <button type="button"
class="close" data-dismiss="alert">x</button>
#{messages}
</div>
HTML
html.html_safe
end
end
- 1
module StaticPagesHelper
end
- 1
module TransactionsHelper
- 1
def transaction_chart_data
(2.weeks.ago.to_date..Date.today).map do |date|
[ date,
@transactions.where("date(created_at) = ?", date).sum(:amount).to_f
]
end
end
end
- 1
class Account < ActiveRecord::Base
- 1
belongs_to :child
- 1
has_many :transactions, dependent: :destroy
- 1
validates :beginning_balance, :presence => true
- 1
def total
- 3
self.beginning_balance.to_f + self.transactions.sum(:amount).to_f
end
end
- 1
class Bank < ActiveRecord::Base
- 1
belongs_to :parent
- 1
has_many :children, dependent: :destroy
- 1
has_many :transactions, dependent: :destroy
- 1
validates :name, :presence => true
end
- 1
class Child < ActiveRecord::Base
- 1
belongs_to :bank
- 1
has_one :account, dependent: :destroy
- 1
has_many :requests, dependent: :destroy
- 1
delegate :parent, to: :bank
- 1
def email_required?
- 4
false
end
- 1
def email_changed?
- 8
false
end
- 1
devise :database_authenticatable, :registerable,
:rememberable, :trackable, :validatable,
:authentication_keys => [:username]
# def self.find_first_by_auth_conditions(warden_conditions)
# conditions = warden_conditions.dup
# if login = conditions.delete(:username)
# where(conditions).where(["username = :value = lower(:value)", { :value => login }]).first
# else
# where(conditions.to_hash).first
# end
#
# end
end
- 1
class Parent < ActiveRecord::Base
- 1
attr_accessor :login
- 1
has_one :bank, dependent: :destroy
- 1
has_many :requests, dependent: :destroy
- 1
validates :first_name, :presence => true
- 1
validates :last_name, :presence => true
- 1
validates :username, :presence => true
- 1
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable,
:authentication_keys => [:login]
- 1
def self.find_first_by_auth_conditions(warden_conditions)
conditions = warden_conditions.dup
if login = conditions.delete(:login)
where(conditions).where(["username = :value OR lower(email) = lower(:value)", { :value => login }]).first
else
where(conditions.to_hash).first
end
end
end
- 1
class Request < ActiveRecord::Base
- 1
belongs_to :parent
- 1
belongs_to :child
- 1
validates(:request_type, {:presence => true})
- 1
validates(:amount, {:presence => true})
- 1
validates(:description, {:presence => true})
end
- 1
class Transaction < ActiveRecord::Base
- 1
belongs_to :account
- 1
belongs_to :bank
- 1
validates :amount, :presence => true
- 1
validates :transaction_type, :presence => true
- 1
validates :description, :presence => true
- 1
def self.transaction_chart_data(account)
- 3
start_date = account.created_at.to_datetime
- 3
end_date = Date.today
- 3
days = (end_date - start_date).ceil
- 3
(30.day.ago.to_date..Date.today.tomorrow).map do |date|
{ date: date.in_time_zone,
total: self.where(:created_at => 30.day.ago..date.end_of_day).sum(:amount).to_f + account.beginning_balance
- 93
}
end
end
- 1
def self.search(search)
- 2
if search != ""
- 2
where('description LIKE ?', "%#{search}%")
else
self.all
end
end
end
- 1
require File.expand_path('../boot', __FILE__)
- 1
require "rails"
# Pick the frameworks you want:
- 1
require "active_model/railtie"
- 1
require "active_job/railtie"
- 1
require "active_record/railtie"
- 1
require "action_controller/railtie"
- 1
require "action_mailer/railtie"
- 1
require "action_view/railtie"
- 1
require "sprockets/railtie"
# require "rails/test_unit/railtie"
# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
- 1
Bundler.require(*Rails.groups)
- 1
module MyPiggybank
- 1
class Application < Rails::Application
# Settings in config/environments/* take precedence over those specified here.
# Application configuration should go into files in config/initializers
# -- all .rb files in that directory are automatically loaded.
# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
# config.time_zone = 'Central Time (US & Canada)'
# The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
# config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
# config.i18n.default_locale = :de
# Do not swallow errors in after_commit/after_rollback callbacks.
- 1
config.active_record.raise_in_transactional_callbacks = true
end
end
- 1
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
- 1
require 'bundler/setup' # Set up gems listed in the Gemfile.
# Load the Rails application.
- 1
require File.expand_path('../application', __FILE__)
# Initialize the Rails application.
- 1
Rails.application.initialize!
- 1
Rails.application.configure do
# Settings specified here will take precedence over those in config/application.rb.
# The test environment is used exclusively to run your application's
# test suite. You never need to work with it otherwise. Remember that
# your test database is "scratch space" for the test suite and is wiped
# and recreated between test runs. Don't rely on the data there!
- 1
config.cache_classes = true
# Do not eager load code on boot. This avoids loading your whole application
# just for the purpose of running a single test. If you are using a tool that
# preloads Rails for running tests, you may have to set it to true.
- 1
config.eager_load = true
# Configure static file server for tests with Cache-Control for performance.
- 1
config.serve_static_files = true
- 1
config.static_cache_control = 'public, max-age=3600'
# Show full error reports and disable caching.
- 1
config.consider_all_requests_local = true
- 1
config.action_controller.perform_caching = false
# Raise exceptions instead of rendering exception templates.
- 1
config.action_dispatch.show_exceptions = false
# Disable request forgery protection in test environment.
- 1
config.action_controller.allow_forgery_protection = false
# Tell Action Mailer not to deliver emails to the real world.
# The :test delivery method accumulates sent emails in the
# ActionMailer::Base.deliveries array.
- 1
config.action_mailer.delivery_method = :test
# Randomize the order test cases are executed.
- 1
config.active_support.test_order = :random
# Print deprecation notices to the stderr.
- 1
config.active_support.deprecation = :stderr
# Raises error for missing translations
# config.action_view.raise_on_missing_translations = true
end
# Be sure to restart your server when you modify this file.
# Version of your assets, change this if you want to expire all your assets.
- 1
Rails.application.config.assets.version = '1.0'
# Add additional assets to the asset load path
# Rails.application.config.assets.paths << Emoji.images_path
# Precompile additional assets.
# application.js, application.css, and all non-JS/CSS in app/assets folder are already added.
# Rails.application.config.assets.precompile += %w( search.js )
# Be sure to restart your server when you modify this file.
# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces.
# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ }
# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code.
# Rails.backtrace_cleaner.remove_silencers!
# Be sure to restart your server when you modify this file.
- 1
Rails.application.config.action_dispatch.cookies_serializer = :json
# Use this hook to configure devise mailer, warden hooks and so forth.
# Many of these configuration options can be set straight in your model.
- 1
Devise.setup do |config|
# The secret key used by Devise. Devise uses this key to generate
# random tokens. Changing this key will render invalid all existing
# confirmation, reset password and unlock tokens in the database.
# Devise will use the `secret_key_base` on Rails 4+ applications as its `secret_key`
# by default. You can change it below and use your own secret key.
# config.secret_key = '16c521dcd48b7b3db7c4dffb6c866d63d6978498a63ba401f3bcec51f4d3fa8de3e3e15a8bf54573a95de96c2799d53b6766af19296dff4e19c4d69db5cc56a5'
# ==> Mailer Configuration
# Configure the e-mail address which will be shown in Devise::Mailer,
# note that it will be overwritten if you use your own mailer class
# with default "from" parameter.
- 1
config.mailer_sender =<EMAIL_ADDRESS># Configure the class responsible to send e-mails.
# config.mailer = 'Devise::Mailer'
# ==> ORM configuration
# Load and configure the ORM. Supports :active_record (default) and
# :mongoid (bson_ext recommended) by default. Other ORMs may be
# available as additional gems.
- 1
require 'devise/orm/active_record'
# ==> Configuration for any authentication mechanism
# Configure which keys are used when authenticating a user. The default is
# just :email. You can configure it to use [:username, :subdomain], so for
# authenticating a user, both parameters are required. Remember that those
# parameters are used only when authenticating and not when retrieving from
# session. If you need permissions, you should implement that in a before filter.
# You can also supply a hash where the value is a boolean determining whether
# or not authentication should be aborted when the value is not present.
# config.authentication_keys = [:email]
# Configure parameters from the request object used for authentication. Each entry
# given should be a request method and it will automatically be passed to the
# find_for_authentication method and considered in your model lookup. For instance,
# if you set :request_keys to [:subdomain], :subdomain will be used on authentication.
# The same considerations mentioned for authentication_keys also apply to request_keys.
# config.request_keys = []
# Configure which authentication keys should be case-insensitive.
# These keys will be downcased upon creating or modifying a user and when used
# to authenticate or find a user. Default is :email.
- 1
config.case_insensitive_keys = [:email, :username]
# Configure which authentication keys should have whitespace stripped.
# These keys will have whitespace before and after removed upon creating or
# modifying a user and when used to authenticate or find a user. Default is :email.
- 1
config.strip_whitespace_keys = [:email, :username]
# Tell if authentication through request.params is enabled. True by default.
# It can be set to an array that will enable params authentication only for the
# given strategies, for example, `config.params_authenticatable = [:database]` will
# enable it only for database (email + password) authentication.
# config.params_authenticatable = true
# Tell if authentication through HTTP Auth is enabled. False by default.
# It can be set to an array that will enable http authentication only for the
# given strategies, for example, `config.http_authenticatable = [:database]` will
# enable it only for database authentication. The supported strategies are:
# :database = Support basic authentication with authentication key + password
# config.http_authenticatable = false
# If 401 status code should be returned for AJAX requests. True by default.
# config.http_authenticatable_on_xhr = true
# The realm used in Http Basic Authentication. 'Application' by default.
# config.http_authentication_realm = 'Application'
# It will change confirmation, password recovery and other workflows
# to behave the same regardless if the e-mail provided was right or wrong.
# Does not affect registerable.
# config.paranoid = true
# By default Devise will store the user in session. You can skip storage for
# particular strategies by setting this option.
# Notice that if you are skipping storage for all authentication paths, you
# may want to disable generating routes to Devise's sessions controller by
# passing skip: :sessions to `devise_for` in your config/routes.rb
- 1
config.skip_session_storage = [:http_auth]
# By default, Devise cleans up the CSRF token on authentication to
# avoid CSRF token fixation attacks. This means that, when using AJAX
# requests for sign in and sign up, you need to get a new CSRF token
# from the server. You can disable this option at your own risk.
# config.clean_up_csrf_token_on_authentication = true
# ==> Configuration for :database_authenticatable
# For bcrypt, this is the cost for hashing the password and defaults to 10. If
# using other encryptors, it sets how many times you want the password re-encrypted.
#
# Limiting the stretches to just one in testing will increase the performance of
# your test suite dramatically. However, it is STRONGLY RECOMMENDED to not use
# a value less than 10 in other environments. Note that, for bcrypt (the default
# encryptor), the cost increases exponentially with the number of stretches (e.g.
# a value of 20 is already extremely slow: approx. 60 seconds for 1 calculation).
- 1
config.stretches = Rails.env.test? ? 1 : 10
# Setup a pepper to generate the encrypted password.
# config.pepper = '9cc003ebe82af4a6246fd7eee63ceea689c6d0699254ee2d3e51f1d979618390d50546df5ba1000a5950fd3a8b56be9f086808bbe3647678d633c73ac189f83f'
# ==> Configuration for :confirmable
# A period that the user is allowed to access the website even without
# confirming their account. For instance, if set to 2.days, the user will be
# able to access the website for two days without confirming their account,
# access will be blocked just in the third day. Default is 0.days, meaning
# the user cannot access the website without confirming their account.
# config.allow_unconfirmed_access_for = 2.days
# A period that the user is allowed to confirm their account before their
# token becomes invalid. For example, if set to 3.days, the user can confirm
# their account within 3 days after the mail was sent, but on the fourth day
# their account can't be confirmed with the token any more.
# Default is nil, meaning there is no restriction on how long a user can take
# before confirming their account.
# config.confirm_within = 3.days
# If true, requires any email changes to be confirmed (exactly the same way as
# initial account confirmation) to be applied. Requires additional unconfirmed_email
# db field (see migrations). Until confirmed, new email is stored in
# unconfirmed_email column, and copied to email column on successful confirmation.
- 1
config.reconfirmable = true
# Defines which key will be used when confirming an account
# config.confirmation_keys = [:email]
# ==> Configuration for :rememberable
# The time the user will be remembered without asking for credentials again.
# config.remember_for = 2.weeks
# Invalidates all the remember me tokens when the user signs out.
- 1
config.expire_all_remember_me_on_sign_out = true
# If true, extends the user's remember period when remembered via cookie.
# config.extend_remember_period = false
# Options to be passed to the created cookie. For instance, you can set
# secure: true in order to force SSL only cookies.
# config.rememberable_options = {}
# ==> Configuration for :validatable
# Range for password length.
- 1
config.password_length = 8..72
# Email regex used to validate email formats. It simply asserts that
# one (and only one) @ exists in the given string. This is mainly
# to give user feedback and not to assert the e-mail validity.
# config.email_regexp = /\A[^@]+@[^@]+\z/
# ==> Configuration for :timeoutable
# The time you want to timeout the user session without activity. After this
# time the user will be asked for credentials again. Default is 30 minutes.
# config.timeout_in = 30.minutes
# ==> Configuration for :lockable
# Defines which strategy will be used to lock an account.
# :failed_attempts = Locks an account after a number of failed attempts to sign in.
# :none = No lock strategy. You should handle locking by yourself.
# config.lock_strategy = :failed_attempts
# Defines which key will be used when locking and unlocking an account
# config.unlock_keys = [:email]
# Defines which strategy will be used to unlock an account.
# :email = Sends an unlock link to the user email
# :time = Re-enables login after a certain amount of time (see :unlock_in below)
# :both = Enables both strategies
# :none = No unlock strategy. You should handle unlocking by yourself.
# config.unlock_strategy = :both
# Number of authentication tries before locking an account if lock_strategy
# is failed attempts.
# config.maximum_attempts = 20
# Time interval to unlock the account if :time is enabled as unlock_strategy.
# config.unlock_in = 1.hour
# Warn on the last attempt before the account is locked.
# config.last_attempt_warning = true
# ==> Configuration for :recoverable
#
# Defines which key will be used when recovering the password for an account
# config.reset_password_keys = [:email]
# Time interval you can reset your password with a reset password key.
# Don't put a too small interval or your users won't have the time to
# change their passwords.
- 1
config.reset_password_within = 6.hours
# When set to false, does not sign a user in automatically after their password is
# reset. Defaults to true, so a user is signed in automatically after a reset.
# config.sign_in_after_reset_password = true
# ==> Configuration for :encryptable
# Allow you to use another encryption algorithm besides bcrypt (default). You can use
# :sha1, :sha512 or encryptors from others authentication tools as :clearance_sha1,
# :authlogic_sha512 (then you should set stretches above to 20 for default behavior)
# and :restful_authentication_sha1 (then you should set stretches to 10, and copy
# REST_AUTH_SITE_KEY to pepper).
#
# Require the `devise-encryptable` gem when using anything other than bcrypt
# config.encryptor = :sha512
# ==> Scopes configuration
# Turn scoped views on. Before rendering "sessions/new", it will first check for
# "users/sessions/new". It's turned off by default because it's slower if you
# are using only default views.
- 1
config.scoped_views = true
# Configure the default scope given to Warden. By default it's the first
# devise role declared in your routes (usually :user).
# config.default_scope = :user
# Set this configuration to false if you want /users/sign_out to sign out
# only the current scope. By default, Devise signs out all scopes.
# config.sign_out_all_scopes = true
# ==> Navigation configuration
# Lists the formats that should be treated as navigational. Formats like
# :html, should redirect to the sign in page when the user does not have
# access, but formats like :xml or :json, should return 401.
#
# If you have any extra navigational formats, like :iphone or :mobile, you
# should add them to the navigational formats lists.
#
# The "*/*" below is required to match Internet Explorer requests.
# config.navigational_formats = ['*/*', :html]
# The default HTTP method used to sign out a resource. Default is :delete.
- 1
config.sign_out_via = :delete
# ==> OmniAuth
# Add a new OmniAuth provider. Check the wiki for more information on setting
# up on your models and hooks.
# config.omniauth :github, 'APP_ID', 'APP_SECRET', scope: 'user,public_repo'
# ==> Warden configuration
# If you want to use other strategies, that are not supported by Devise, or
# change the failure app, you can configure them inside the config.warden block.
#
# config.warden do |manager|
# manager.intercept_401 = false
# manager.default_strategies(scope: :user).unshift :some_external_strategy
# end
# ==> Mountable engine configurations
# When using Devise inside an engine, let's call it `MyEngine`, and this engine
# is mountable, there are some extra configurations to be taken into account.
# The following options are available, assuming the engine is mounted as:
#
# mount MyEngine, at: '/my_engine'
#
# The router that invoked `devise_for`, in the example above, would be:
# config.router_name = :my_engine
#
# When using OmniAuth, Devise cannot automatically set OmniAuth path,
# so you need to do it manually. For the users scope, it would be:
# config.omniauth_path_prefix = '/my_engine/users/auth'
end
# Be sure to restart your server when you modify this file.
# Configure sensitive parameters which will be filtered from the log file.
- 1
Rails.application.config.filter_parameters += [:password]
# Be sure to restart your server when you modify this file.
# Add new inflection rules using the following format. Inflections
# are locale specific, and you may define rules for as many different
# locales as you wish. All of these examples are active by default:
# ActiveSupport::Inflector.inflections(:en) do |inflect|
# inflect.plural /^(ox)$/i, '\1en'
# inflect.singular /^(ox)en/i, '\1'
# inflect.irregular 'person', 'people'
# inflect.uncountable %w( fish sheep )
# end
# These inflection rules are supported but not enabled by default:
# ActiveSupport::Inflector.inflections(:en) do |inflect|
# inflect.acronym 'RESTful'
# end
# Be sure to restart your server when you modify this file.
# Add new mime types for use in respond_to blocks:
# Mime::Type.register "text/richtext", :rtf
# Be sure to restart your server when you modify this file.
- 1
Rails.application.config.session_store :cookie_store, key: '_my_piggybank_session'
# Be sure to restart your server when you modify this file.
# This file contains settings for ActionController::ParamsWrapper which
# is enabled by default.
# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array.
- 1
ActiveSupport.on_load(:action_controller) do
- 1
wrap_parameters format: [:json] if respond_to?(:wrap_parameters)
end
# To enable root element in JSON for ActiveRecord objects.
# ActiveSupport.on_load(:active_record) do
# self.include_root_in_json = true
# end
- 1
Rails.application.routes.draw do
- 1
get 'static_pages/home'
- 1
get 'static_pages/help'
- 1
get 'static_pages/about'
- 1
root 'static_pages#home'
- 1
get 'static_pages/home' 'home' => 'static_pages#home'
- 1
get 'static_pages/help' 'help' => 'static_pages#help'
- 1
get '/about' => 'static_pages#about'
- 1
devise_for :parents, controllers: { registrations: "parents/registrations", sessions: "parents/sessions" }
- 1
devise_for :children, controllers: { sessions: "children/sessions", registrations: "children/registrations" }
- 1
resources :parents do
- 1
resources :banks
end
- 1
resources :banks do
- 1
resources :children
end
- 1
resources :children do
- 1
resources :accounts
end
- 1
resources :accounts do
- 1
resources :transactions
end
- 1
resources :requests
end
# The priority is based upon order of creation: first created -> highest priority.
# See how all your routes lay out with "rake routes".
# You can have the root of your site routed with "root"
# root 'welcome#index'
# Example of regular route:
# get 'products/:id' => 'catalog#view'
# Example of named route that can be invoked with purchase_url(id: product.id)
# get 'products/:id/purchase' => 'catalog#purchase', as: :purchase
# Example resource route (maps HTTP verbs to controller actions automatically):
# resources :products
# Example resource route with options:
# resources :products do
# member do
# get 'short'
# post 'toggle'
# end
#
# collection do
# get 'sold'
# end
# end
# Example resource route with sub-resources:
# resources :products do
# resources :comments, :sales
# resource :seller
# end
# Example resource route with more complex sub-resources:
# resources :products do
# resources :comments
# resources :sales do
# get 'recent', on: :collection
# end
# end
# Example resource route with concerns:
# concern :toggleable do
# post 'toggle'
# end
# resources :posts, concerns: :toggleable
# resources :photos, concerns: :toggleable
# Example resource route within a namespace:
# namespace :admin do
# # Directs /admin/products/* to Admin::ProductsController
# # (app/controllers/admin/products_controller.rb)
# resources :products
# end
- 1
require 'rails_helper'
- 1
RSpec.describe StaticPagesController, type: :controller do
- 1
describe "GET #home" do
- 1
it "returns http success" do
- 1
get :home
- 1
expect(response).to have_http_status(:success)
end
end
- 1
describe "GET #help" do
- 1
it "returns http success" do
- 1
get :help
- 1
expect(response).to have_http_status(:success)
end
end
- 1
describe "GET #about" do
- 1
it "returns http success" do
- 1
get :about
- 1
expect(response).to have_http_status(:success)
end
end
end
- 1
FactoryGirl.define do
- 1
factory :parent do
- 1
email<EMAIL_ADDRESS>- 1
password 'f4k3p455w0rd'
- 1
username 'fakeuser'
- 1
first_name "fake"
- 1
last_name "user"
end
end
- 1
require 'rails_helper'
- 1
describe "the add account path", js: true do
- 1
it 'creates a child account' do
- 1
add_child
- 1
click_link "Start Account"
- 1
fill_in "Beginning balance", with: "120.00"
- 1
click_button "Submit"
- 1
expect(page).to have_content "View Account"
end
end
- 1
require 'rails_helper'
- 1
describe "the add a bank process" do
- 1
it 'adds a bank to a parent' do
- 1
sign_up
- 1
fill_in 'Name', with: "My Bank"
- 1
click_button "Add Bank"
- 1
expect(page).to have_content "My Bank"
end
end
- 1
require 'rails_helper'
- 1
describe "the add a child process" do
- 1
it 'adds a child to a bank' do
- 1
add_bank
- 1
click_link "Add a child to your bank"
- 1
fill_in "Username", with: "ExampleKid"
- 1
fill_in "First name", with: "Example"
- 1
fill_in "Last name", with: "Kid"
- 1
fill_in "Password", with: "examplekid"
- 1
fill_in "Password confirmation", with: "examplekid"
- 1
click_button "Sign up"
- 1
expect(page).to have_content "examplekid"
end
end
- 1
require 'rails_helper'
- 1
describe "the add request path", js: true do
- 1
it 'creates a transaction request' do
- 1
child_login
- 1
click_link "Save Money"
- 1
fill_in "What is this money for?", with: "Birthday Money"
- 1
fill_in "Amount", with: 50.00
- 1
click_button "Request transaction"
- 1
expect(page).to have_content("Birthday Money")
end
end
- 1
require 'rails_helper'
- 1
describe "the add transaction path", js: true do
- 1
it 'creates a transaction' do
- 1
add_account
- 1
sleep 2
- 1
click_on "View Account"
- 1
sleep 6
- 1
save_and_open_page
- 1
click_link "new_transaction_link"
- 1
fill_in "Description", with: "Chores"
- 1
choose('transaction_transaction_type_deposit')
- 1
fill_in "Amount", with: 12.25
- 1
click_button "Add transaction"
- 1
expect(page).to have_content("Chores")
end
end
- 1
require 'rails_helper'
# Specs in this file have access to a helper object that includes
# the StaticPagesHelper. For example:
#
# describe StaticPagesHelper do
# describe "string concat" do
# it "concats two strings with spaces" do
# expect(helper.concat_strings("this","that")).to eq("this that")
# end
# end
# end
- 1
RSpec.describe StaticPagesHelper, type: :helper do
- 1
pending "add some examples to (or delete) #{__FILE__}"
end
- 1
require 'rails_helper'
- 1
describe Account do
- 2
it { should belong_to :child}
- 2
it { should validate_presence_of :beginning_balance}
- 2
it { should have_many :transactions }
end
- 1
require 'rails_helper'
- 1
describe Bank do
- 2
it { should belong_to :parent }
- 2
it { should have_many :children}
- 2
it { should validate_presence_of :name }
- 2
it { should have_many :transactions}
end
- 1
require 'rails_helper'
- 1
describe Child do
- 2
it { should belong_to :bank }
- 2
it { should have_one :account}
- 2
it { should have_many :requests}
end
- 1
require 'rails_helper'
- 1
describe Parent do
- 2
it { should have_one :bank }
- 2
it { should validate_presence_of :first_name }
- 2
it { should validate_presence_of :last_name }
- 2
it { should validate_presence_of :username }
- 2
it { should have_many :requests}
end
- 1
require 'rails_helper'
- 1
describe Request do
- 2
it { should belong_to :parent }
- 2
it { should belong_to :child }
- 2
it { should validate_presence_of :amount }
- 2
it { should validate_presence_of :request_type }
- 2
it { should validate_presence_of :description }
end
- 1
require 'rails_helper'
- 1
describe Transaction do
- 2
it { should belong_to :account }
- 2
it { should validate_presence_of :amount }
- 2
it { should validate_presence_of :transaction_type }
- 2
it { should validate_presence_of :description }
- 2
it { should belong_to :bank }
end
# This file is copied to spec/ when you run 'rails generate rspec:install'
- 1
ENV['RAILS_ENV'] ||= 'test'
- 1
require File.expand_path('../../config/environment', __FILE__)
# Prevent database truncation if the environment is production
- 1
abort("The Rails environment is running in production mode!") if Rails.env.production?
- 1
require 'spec_helper'
- 1
require 'rspec/rails'
- 1
include Warden::Test::Helpers
- 1
Warden.test_mode!
- 1
require 'capybara/poltergeist'
- 1
Capybara.javascript_driver = :poltergeist
- 1
options = {js_errors: false}
- 1
Capybara.register_driver :poltergeist do |app|
- 1
Capybara::Poltergeist::Driver.new(app, options)
end
# Add additional requires below this line. Rails is not loaded until this point!
# Requires supporting ruby files with custom matchers and macros, etc, in
# spec/support/ and its subdirectories. Files matching `spec/**/*_spec.rb` are
# run as spec files by default. This means that files in spec/support that end
# in _spec.rb will both be required and run as specs, causing the specs to be
# run twice. It is recommended that you do not name files matching this glob to
# end with _spec.rb. You can configure this pattern with the --pattern
# option on the command line or in ~/.rspec, .rspec or `.rspec-local`.
#
# The following line is provided for convenience purposes. It has the downside
# of increasing the boot-up time by auto-requiring all files in the support
# directory. Alternatively, in the individual `*_spec.rb` files, manually
# require only the support files necessary.
#
# Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
# Checks for pending migrations before tests are run.
# If you are not using ActiveRecord, you can remove this line.
- 1
ActiveRecord::Migration.maintain_test_schema!
- 1
RSpec.configure do |config|
# Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
- 1
config.fixture_path = "#{::Rails.root}/spec/fixtures"
# If you're not using ActiveRecord, or you'd prefer not to run each of your
# examples within a transaction, remove the following line or assign false
# instead of true.
# config.use_transactional_fixtures = true
- 1
config.before(:suite) do
- 1
DatabaseCleaner.strategy = :truncation
end
- 1
config.around(:each) do |example|
- 33
DatabaseCleaner.cleaning do
- 33
example.run
end
end
# RSpec Rails can automatically mix in different behaviours to your tests
# based on their file location, for example enabling you to call `get` and
# `post` in specs under `spec/controllers`.
#
# You can disable this behaviour by removing the line below, and instead
# explicitly tag your specs with their type, e.g.:
#
# RSpec.describe UsersController, :type => :controller do
# # ...
# end
#
# The different available types are documented in the features, such as in
# https://relishapp.com/rspec/rspec-rails/docs
- 1
config.infer_spec_type_from_file_location!
end
- 1
Shoulda::Matchers.configure do |config|
- 1
config.integrate do |with|
- 1
with.test_framework :rspec
- 1
with.library :rails
end
end
- 1
def sign_up
- 5
visit "/"
- 5
click_link "Parent Sign up"
- 5
fill_in "Email", with<EMAIL_ADDRESS>- 5
fill_in "Username", with: "testperson"
- 5
fill_in "First name", with: "test"
- 5
fill_in "Last name", with: "person"
- 5
fill_in "Password", with: "testperson"
- 5
fill_in "Password confirmation", with: "testperson"
- 5
click_button "Sign up"
end
- 1
def add_bank
- 4
sign_up
- 4
fill_in 'Name', with: "My Bank"
- 4
click_button "Add Bank"
end
- 1
def add_child
- 3
add_bank
- 3
click_link "Add a child to your bank"
- 3
fill_in "Username", with: "ExampleKid"
- 3
fill_in "First name", with: "Example"
- 3
fill_in "Last name", with: "Kid"
- 3
fill_in "Password", with: "examplekid"
- 3
fill_in "Password confirmation", with: "examplekid"
- 3
click_button "Sign up"
end
- 1
def add_account
- 2
add_child
- 2
click_link "Start Account"
- 2
fill_in "Beginning balance", with: "120.00"
- 2
click_button "Submit"
end
- 1
def add_transaction
add_account
visit "/"
click_link "My Bank (testperson)"
click_link "View Account"
click_link "Make a transaction"
fill_in "Description", with: "Chores"
choose('transaction_transaction_type_deposit')
fill_in "Amount", with: 12.25
click_button "Add transaction"
end
- 1
def child_login
- 1
add_account
- 1
click_link "Log Out"
- 1
click_link "Child Sign In"
- 1
fill_in "Username", with: "ExampleKid"
- 1
fill_in "Password", with: "examplekid"
- 1
click_button "Log in"
end
- 1
require 'rails_helper'
- 1
RSpec.describe "static_pages/about.html.erb", type: :view do
- 1
pending "add some examples to (or delete) #{__FILE__}"
end
- 1
require 'rails_helper'
- 1
RSpec.describe "static_pages/help.html.erb", type: :view do
- 1
pending "add some examples to (or delete) #{__FILE__}"
end
- 1
require 'rails_helper'
- 1
RSpec.describe "static_pages/home.html.erb", type: :view do
- 1
pending "add some examples to (or delete) #{__FILE__}"
end


What Do Americans Think About Impeachment? We Asked Over 2,000 People.
by Anna Rothschild, Laura Bronner, Amelia Thomson-DeVeauxWhat do Americans think about impeachment? Do they think President Trump acted inappropriately? And how strongly do they hold their views?
FiveThirtyEight partnered with Ipsos to see how people’s opinions change over the course of the inquiry. Here are the results of our first FiveThirtyEight/Ipsos poll on impeachment, conducted using Ipsos’s KnowledgePanel. We’ll be checking in with these same Americans again in the coming weeks to see how their views on impeachment shift.


|
|||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
Access the Attachments of a Message. This interface essentially firewalls the rest of Axis from any dependencies on javax.activation.
If javax.activation is not available, this is the *only* class that will be compiled in org.apache.axis.attachments.
| Field Summary | |
static java.lang.String |
CIDprefix
The prefix used to assoc. |
static int |
SEND_TYPE_DEFAULT
The default attatchment type. |
static int |
SEND_TYPE_DIME
Use the DIME attatchment type. |
static int |
SEND_TYPE_MAX
|
static int |
SEND_TYPE_MIME
Use the SOAP with MIME attatchment send type. |
static int |
SEND_TYPE_NONE
Use the DIME attatchment type. |
static int |
SEND_TYPE_NOTSET
Use the default attatchment send type. |
| Method Summary | |
Part |
addAttachmentPart(Part newPart)
Adds an existing attachment to this list. |
Part |
createAttachmentPart()
Create a new attachment Part in this Message. |
Part |
createAttachmentPart(java.lang.Object part)
Create a new attachment Part in this Message. |
Part |
getAttachmentByReference(java.lang.String reference)
This method should look at a refernce and determine if it is a CID: or url to look for attachment. |
int |
getAttachmentCount()
This is the number of attachments. |
java.util.Collection |
getAttachments()
This method will return all attachments as a collection. |
java.util.Iterator |
getAttachments(MimeHeaders headers)
Retrieves all the AttachmentPart objects
that have header entries that match the specified headers. |
long |
getContentLength()
Get the content length of the stream. |
java.lang.String |
getContentType()
Write the content to the stream. |
Part |
getRootPart()
From the complex stream return the SOAP part. |
int |
getSendType()
Determine if an object is to be treated as an attchment. |
boolean |
isAttachment(java.lang.Object value)
Determine if an object is to be treated as an attchment. |
void |
removeAllAttachments()
Removes all AttachmentPart objects that have
been added to this SOAPMessage object. |
Part |
removeAttachmentPart(java.lang.String reference)
This method uses getAttacmentByReference() to look for attachment. |
void |
setAttachmentParts(java.util.Collection parts)
Will the attachments of this message to that of the colleciton. |
void |
setRootPart(Part newRoot)
Sets the root part of this multipart block |
void |
setSendType(int sendtype)
Set the format for attachments. |
void |
writeContentToStream(java.io.OutputStream os)
Write the content to the stream. |
| Field Detail |
public static final int SEND_TYPE_NOTSET
public static final int SEND_TYPE_MIME
public static final int SEND_TYPE_DIME
public static final int SEND_TYPE_NONE
public static final int SEND_TYPE_MAX
public static final int SEND_TYPE_DEFAULT
public static final java.lang.String CIDprefix
| Method Detail |
public Part addAttachmentPart(Part newPart) throws AxisFault
newPart
- new part to add
AxisFault
public Part removeAttachmentPart(java.lang.String reference) throws AxisFault
reference
- The reference that referers to an attachment.
AxisFault
public void removeAllAttachments()
AttachmentPart
objects that have
been added to this SOAPMessage
object.
This method does not touch the SOAP part.
public Part getAttachmentByReference(java.lang.String reference) throws AxisFault
reference
- The reference in the xml that referers to an attachment.
AxisFault
public java.util.Collection getAttachments() throws AxisFault
AxisFault
public java.util.Iterator getAttachments(MimeHeaders headers)
AttachmentPart
objects
that have header entries that match the specified headers.
Note that a returned attachment could have headers in
addition to those specified.
headers
- a MimeHeaders
object containing the MIME headers for which to
search
public Part createAttachmentPart(java.lang.Object part) throws AxisFault
part
- The part that is referenced
AxisFault
public Part createAttachmentPart() throws AxisFault
AxisFault
public void setAttachmentParts(java.util.Collection parts) throws AxisFault
parts
-
AxisFault
public Part getRootPart()
public void setRootPart(Part newRoot)
newRoot
- public long getContentLength() throws AxisFault
AxisFault
public void writeContentToStream(java.io.OutputStream os) throws AxisFault
os
- the stream
AxisFault
public java.lang.String getContentType() throws AxisFault
AxisFault
public int getAttachmentCount()
public boolean isAttachment(java.lang.Object value)
value
- the value that is to be determined if
its an attachment.
public void setSendType(int sendtype)
sendtype
- the format to send.
SEND_TYPE_MIME for Multipart Releated Mail type attachments.
SEND_TYPE_DIME for DIME type attachments.public int getSendType()
|
|||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |


It is a period of civil war. Rebel spaceships, striking from a hidden base, have won their first victory against the evil Galactic Empire.

Pursued by the Empire's sinister agents, Princess Leia races home aboard her starship, custodian of the stolen plan that can save her people and restore freedom to the galaxy...


Classes are an extremely useful tool for creating multiple objects that are apart of the same category or class. Let's explore how they work with an example using one of the best games of my childhood...and adulthood, Pokemon!
Let's just go through each part of the code starting from the top. The "class Pokemon" defines the class of objects that we will be creating as pokemon, so each object that we create from this class will be a pokemon.On line 17, we see how this happens by creating a variable called "fav_pokemon," which creates a new pokemon object by setting it equal to the Pokemon class and calling 'new' on it. The parameters passed after new will be used on line 2 as the main variables to be used by the class and define the instance variables of the class. Instance variables are a bit different from normal local variables we have used in the past. They are differentiated by the '@' symbol followed by its name, and are seen throughout the entire scope of the class.
The instances variables of name, type, and level are initialized on lines 3, 4, and 5, so that they can be set to whatever information the user passed through as the information for that particular object of the class. If we want to output these instance variables to the console, we just use the #{} symbols in the string and make sure to the include the '@' in the name of the instance variable and we can output its value easily. Line 13 shows an example of this implementation.
Each class we create also defines its own intance methods that make up the information pertinant to the objects it creates. In our Pokemon class, we will want to create pokemon, check their status, and see them level up. So these are the methods that are involved in creating Pokemon. The 'new' method is not exactly an instance method however since that is a method that comes by default with each class, but our other two methods ,"level_up" and "status" are. These are called on lines 18 and 19 and are done so in a manner similar to other method calls. The only difference here is that these methods will only work for objects created from the Pokemon class.
So there you have it, the basics of how to use a class using one of the best games of all time!
| T-1 | T-2 | T-3 | T-4 | T-5 | T-6 | T-7 | T-8 |
| C-1 | C-3 | C-4 | C-5 | C-6 | C-7 | C-8 | C-9 |


We have specially redesigned a 25 year anniversary of Edward S. Herman's and Noam Chomsky's riveting work, Manufacturing Consent. This hardcover release will be yours for the price of $29.95 and includes a new introduction from the authors.
Buy it HereBorn in Philadelphia on December 7, 1928, Noam Chomsky was an intellectual prodigy who went on to earn a PhD in linguistics at the University of Pennsylvania.
Read More


 May you all cherish this moment as the crowning achievement of human existence that this truly is.
{% if user.is_staff %} {% endif %} {% endblock %}


Salmon Cookies shop study
Home
About Us
Add A Location
Salmon Shops
Location:
MAX Cust
MIN Cust
Aerage Cust
Data


--- subject: Welcome to Roselinlin --- NEW IN BEST SELLER DRESSES TOPS BOTTOMS SHOES Summer Solid Casual Long Sleeve Blouse Women Long Sleeves V Neck Loose-Ness Fit Shirt Tops Stripes V Neck Casual Long Sleeve Blouses Casual V Neck Long Sleeve Shirts & Tops Women Casual Cotton Bottoms Pants Women Casual Summer Pockets Striped Capri Linen Pants Casual Pockets Striped Bottoms Casual Plain Pockets Pant Best Tops Linen Bottoms Casual Dresses Under $19.99 If you have any questions regarding your orders or products, please feel free to contact us at<EMAIL_ADDRESS>Best Tops
Linen Bottoms
Casual Dresses
Under $19.99


{% extends "modal_form.html" %}
{% load i18n %}
{% block pre_form_content %}
{% trans 'Mark this order as complete?' %}
{% if not order.is_complete %}
{% trans 'This order has line items which have not been marked as received.' %}
{% trans 'Completing this order means that the order and line items will no longer be editable.' %}


Each function accomplishes the work of several or more standard R functions. For example, two function calls, Read() and CountAll(), read the data and generate summary statistics for all variables in the data frame, plus histograms and bar charts as appropriate. Other functions provide for descriptive statistics, a comprehensive regression analysis, analysis of variance and t-test, plotting including the introduced here Violin/Box/Scatter plot for a numerical variable, bar chart, histogram, box plot, density curves, calibrated power curve, reading multiple data formats with the same function call, variable labels, color themes, Trellis graphics and a built-in help system. Also includes a confirmatory factor analysis of multiple indicator measurement models, pedagogical routines for data simulation such as for the Central Limit Theorem, and generation of R markdown instructions for interpretative output.
| Version: | 3.7.9 |
| Depends: | R (≥ 2.15.0) |
| Imports: | graphics, grDevices, stats, utils, foreign, methods, lattice, latticeExtra, robustbase, ellipse, leaps, sas7bdat, openxlsx, triangle, png, colorspace, viridisLite, wesanderson, randomcoloR |
| Suggests: | KernSmooth |
| Published: | 2018-12-10 |
| Author: | David W. Gerbing, The School of Business, Portland State University |
| Maintainer: | David W. Gerbing <gerbing at pdx.edu> |
| License: | GPL-2 | GPL-3 [expanded from: GPL (≥ 2)] |
| NeedsCompilation: | no |
| Citation: | lessR citation info |
| Materials: | NEWS |
| CRAN checks: | lessR results |
| Reference manual: | lessR.pdf |
| Package source: | lessR_3.7.9.tar.gz |
| Windows binaries: | r-devel: lessR_3.7.9.zip, r-release: lessR_3.7.9.zip, r-oldrel: lessR_3.7.9.zip |
| OS X binaries: | r-release: lessR_3.7.9.tgz, r-oldrel: lessR_3.7.9.tgz |
| Old sources: | lessR archive |
Please use the canonical form https://CRAN.R-project.org/package=lessR to link to this page.


other stores X gogo is a fashion collection that is designed by my close friend gogo wang.
The collection is chic and elegant. It is designed for women who just stepped into their professionals.
By only using 3 basic shapes and curves, I used p5.js to generate logos that represents that the shape of the clothes, and also the body shape of women.
The logo is based on a design system that I set. Each consumer will get a slightly different logo on the clothes package.
< < back to check other projects
back to top


Some Asp.Net MVC details and other thoughts.
We are preparing to start a new project at work - the replacement of an old Lotus Notes "app" with a SQL DB and a web front end. I've exerted what little influence I have in the pre-design meeting to push us toward more modern tech (still in the MS ecosystem): MVC with Entity Framework and hopefully a thick client-side app pulling data via AJAX requests.
Since the meeting I've spent some time researching what we picked and thinking about the application structure. The interesting parts fall in two categories:
I have used EF a couple of times now, and done some additional reading and
training on it, but I don't think the rest of the dev team are that familiar
with it. MVC will also be a new experience for some of them, especially pushing
work from the server to the clients (no more runat=server
). Since I would
prefer to use these technologies, and to use them well, I am trying to be an
advocate for them. I can see already how easy it would be for this team to get
under a little pressure and decide to just chuck the whole thing for Webforms.
Using Windows Auth in MVC
One of the first problems I think they will run into is the MVC default template and its deep dependence on the newish OWIN middleware, and Identity Framework for auth. There's nothing wrong with either of these if you need what they provide, but our new app is going to be strictly intranet with auth handled by the domain. So to simplify our application I created a dummy project and set to work cutting out all the unnecessary bits.
I admit I got most of this information from a collection of StackOverflow Answers , and don't fully grasp the intent or necessity of all of them. Someone with more interest and time feel free to test all the possible combinations.
Enable
Firstly I enabled Windows Auth. This required changes to the web.config file, changes to the project properties, and editing some code in startup. Here are the changes to web.config:
<appSettings>
<!-- Add the following -->
<add key="autoFormsAuthentication" value="false"/>
<add key="enableSimpleMembership" value="false"/>
</appSettings>
<system.web>
<!-- Add the following -->
<authentication mode="Windows" />
<authorization>
<deny users="?" />
</authorization>
</system.web>
<system.webServer>
<modules>
<!-- Add the following -->
<remove name="FormsAuthenticationModule" />
</modules>
</system.webServer>
Next select your MVC project in the Solution Explorer and in properties ensure Windows Authentication is enabled and Anonymous Authentication is disabled.
Finally edit Startup.Auth.cs (you can skip this step if you are going to remove the builtin auth system entirely):
public partial class Startup
{
public void ConfigureAuth(IAppBuilder app)
{
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);
// ----- Start deleting here -----
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/LogIn"),
Provider = new CookieAuthenticationProvider
{
// There might be different things in here...
}
});
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
// ----- End deleting here -----
app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie,
TimeSpan.FromMinutes(5));
etc.
}
}
Now when you run your app you should see your logon name on the Home.Index page.
Remove
The next step for me was to remove everything that wasn't Windows Auth. I
started by deleting Startup.cs
, App_startup/Startup.Auth.cs
, and
App_startup/IdentityConfig.cs
since they are only used by OWIN. I also deleted
all Account
and Manage
views and controllers since they are for Identity
management. In my case I also deleted the entire Models
folder since my
DAL lives in another project
in the solution and everything in Models
is there to support Identity.
Next comes package removal, which is made complex by the inter-package depednacies: You can only uninstall a package once all its dependents are uninstalled. I didn't really figure out the order, I just kept trying to uninstall each package in order until they were all gone. Here is the list of what was unnecessary (I also took the opportunity to remove appInsights):
- microsoft.aspnet.identity.owin
- microsoft.owin.host.systemweb
- microsoft.owin.security.cookies
- microsoft.owin.security.facebook
- microsoft.owin.security.google
- microsoft.owin.security.microsoftaccount
- microsoft.owin.security.twitter
- microsoft.aspnet.identity.entityframework
- (anything with application insights in the name)
The only thing I left was microsoft.aspnet.identity.core
, which gives you
access to Windows Auth info (e.g. Microsoft.AspNet.Identity
and
User.Identity.GetUserName
in _loginPartial.cshtml
. Next I had to make more
changes to web.config:
<appSettings>
<!-- Add the following -->
<add key="owin:AutomaticAppStartup" value="false" />
</appSettings>
<runtime>
<AssemblyBinding>
<!-- Delete any of these that referece a removed package -->
<dependantAssembly>
<!--  With the project cleaned up it is much easier to
focus on the application logic instead of the Microsoft baggage.
EF Codebase Structure (architecture)
While I was playing with the above I was also having deep thoughts about Entity Framework and the structure of the DAL. By this point I've seen a lot of techniques and best practices for EF. I've found some things I like but I wanted a way to justify those preferences. I also wanted to limit the number of extraneous layers of abstraction I've seen recommended by the enterprise minded.
In my test solution I've spun the DAL off into its own project, because that seems like a good idea. I am treating EF as the data persistence layer, i.e. I want to interact with it as little as possible in DAL code and not at all outside the DAL. The layer above that seems to be where all the controversy is:
- Do you create Repositories around your DBContexts, or are they already repos?
- Do you create Generic repos, or do you get specific?
- Does any business logic live in the POCOs used by EF, or do you create mirrors/wrappers for them, or something else?
- If something else then were does the business logic live?
As I see it there are two clear ends of the spectrum here, on one you have a large complex infrastructure were everything is heavily decoupled, and on the other you have the minimum pretense to CRUD. I definitely feel the allure of architecting that large system, but in the end it feels like it is justifying its own existence by its complexity. I want to start with as few moving parts a necessary, and abstract from there as needed.
The sketch I have in mind is POCOs are just data (pretend they are structs). A repo is created for each perspective/use-case. What little business logic there is in this app will live in the repo methods, or in helper classes (pure static methods). In other words the repos are closer to Business Objects, controlling the what and how of data access. As for justifying my choices I depend mainly on the SRP (Single Responsibility Principle) - That things should have only one reason to change:
- DBContexts represent the DB in code, giving access to tables, views, etc.
- Only changing when new collections need to be accessed.
- POCOs are the object representation of entities (rows) in the DB.
- Only changing to reflect the shape of data in their table.
- Repos provide a higher level Command/Query interface over previous two.
- Only changing in response to interaction requirements.
I think that balances separation of concerns against complexity pretty well, at least for a start. With my repeated deep-dives into the legacy code at work I am continually re-motivated to simplify as much as possible. So many examples of architecture run amok, senseless designs, aimless decoupling, and general blind adherence to design rules letter rather than their intent.
I'm sure I will run into problems with my design, but hopefully simple things will be easier to change.


class UserRespository
Repository Class for Posts
UserRespository(dao: UserDao)
Repository Class for Posts |
var user: LiveData<User>
Returns current user from the dao |
fun insert(user: User): Unit
Async Method to Insert User into DAO |
|
fun nukeUsers(): Unit
Async Method to Delete User into DAO |
|
fun updateUser(user: User): Unit
Async Method to modify User into DAO |


December 20, 2015
Entering into anything new can be overwhelming and intimidating. I should know, I have chosen to enter the field of web development and I'm attending Dev Bootcamp. Dev Bootcamp (DBC) is a development bootcamp geared at taking you from newbie to a "world class beginner" in 18 weeks. It is going to be one of the most challenging experiences of my life. This blog series is designed to be an introduction to the world of development for the novice developer by a novice developer. By the end of this series I hope that you have had an opportunity to grow as much as I have.
Ruby Classes
I guess we have to first define what a Class is in Ruby, which in itself can be somewhat confusing. In Ruby, everything is an Object and you can think of Classes as the declaration of an Object. So a Class is the shell of an object and it is filled with the methods that define that Class. Let's take a look by declaring on new Class, we'll call it Dog
.
One thing you'll notice is that classes are capitalized, that is kind of important. So let's create our Dog
class:
That's it, we're done! Well not really. We have the shell of our class, but we need to bring Dog
to life and we need to start by initializing our Dog
.
So puppy
is a new instance of Dog
and we have passed it the name = 'Atticus'
and the breed = 'German Shepherd'
. Within our class, @name
and @breed
are instance variables and can be used by all the methods within our class. Using instance methods we can now start to define the behaviors that control our Dog
.
Let's start by adding another instance variable when Dog
gets initialized, the instance variable will be @hungry
and we'll initialize to false
. We'll also create our first instance method feed
.
We are on our way, but we need to do more with our Dog
, otherwise how much fun is he? How about we create a new method bored
.
All right, we are getting close to having a real Dog
; let's add two more methods. The first method will make our Dog
sleep and the second will be able to check on the status of our Dog
.
Well, you did it!  What is really amazing is just like in real life, you now have to care for your pet! So you better check in on him, I think he may be @hungry
, @bored
, or @tired
.


How Many Friends Will Be Together With You
问题描述 :
One day dandelion and her friends decides to play outside. As there are so many people , they decide to divide into several parts . Dandelion wants to know how many friends will be together with her. The way they use to divide is : everyone can choose one people to join in her group, Such as if A chooses B to join in her group , then B will leave the group she is in now , and joins in the group that A is in . One can also choose some people who has already in her group. All of dandelion� friends are expressed as an integer 2,3… n and dandelion is expressed as 1.The choosing work begins from dandelion then the friend who are signed as 2 ?until the friend who are signed as n .
输入:
Each case begins with an integer n, (0<n<=1000000) stands for the number of people.
Then follows n lines , the i+1 line contains an integer p, stands for people who are signed as i chooses the one who are signed as p to join in her group.
Then follows n lines , the i+1 line contains an integer p, stands for people who are signed as i chooses the one who are signed as p to join in her group.
输出:
Each case begins with an integer n, (0<n<=1000000) stands for the number of people.
Then follows n lines , the i+1 line contains an integer p, stands for people who are signed as i chooses the one who are signed as p to join in her group.
Then follows n lines , the i+1 line contains an integer p, stands for people who are signed as i chooses the one who are signed as p to join in her group.
样例输入:
3 3 3 1 3 2 1 2
样例输出:
2 0HintHint For the second case , the group is (1)(2)(3) at first , then (1,2)(3) after dandelion� picking , then ( 1 , 2 ) ( 3) , then (1) (2 ,3). So at last , no other people is together with dandelion.
(adsbygoogle = window.adsbygoogle || []).push({});
果断二逼公司
果断二逼公司
果断二逼公司
果断二逼公司
果断二逼公司
果断二逼公司
果断二逼公司
果断二逼公司
果断二逼公司
果断二逼公司
果断二逼公司
不对吧 你算的an是前面说有的项的和
第一题还是比较考验智商~
好的，多谢指出
还是有些难度的！
正在练习，很有帮助
太好了，收藏
https://coding.net/moon/miracle
隐藏最深的bug是(start+end)/2有可能上溢
int L[m+1][n+1];这样定义出错，这个在gcc上可以编译通过 在VS上不行 应该改为new 或者vector
for(int i=1; i<=m; i++){
for(int j=1; j<=n; j++){
dp = dp [j-1] + 1;
if(s1.charAt(i-1) == s3.charAt(i+j-1))
dp = dp[i-1] + 1;
if(s2.charAt(j-1) == s3.charAt(i+j-1))
dp = Math.max(dp [j - 1] + 1, dp );
}
}
这里的代码似乎有点问题？ dp(i)(j) = dp(i)(j-1) + 1;这个例子System.out.println(ils.isInterleave("aa","dbbca", "aadbbcb"));返回的应该是false
赞一个！权限已更新:）
整理的很好，多谢


How to Play: Players take turns rolling a 6-sided die. If a player rolls a number between 2-6, it is added to their turn total and the player's turn continues. If a player chooses to "hold", their turn total is added to their score and the next player starts. If a player roles a "1", they score nothing and their turn ends. The first player to 100 points wins!


Don't Miss Out | What can you do with $100?
20% off when you spend $100 or more | Hurry, Ends Sunday
http://click.harborfreightemail.com/?qs=321e884f47eeed6350ce29accae7afed536505a43525a94620a7c44cf2e1b5f8b420a0b63e92a030
view this email online |
http://click.harborfreightemail.com/?qs=321e884f47eeed6318deffc248bec85ada2e045d57433c230ebf78a0ab2c33d646c04e22eb00aa8c
Forward to a Friend
Shop
http://click.harborfreightemail.com/?qs=321e884f47eeed6384b8ccfb2352499a9e0d9c0291d19d51f9a2bc07150f367134d6a8ccfd4c9d99
www.HarborFreight.com or Call 1-800-423-2567 to Order
Visit Harbor Freight Tools:
http://click.harborfreightemail.com/?qs=321e884f47eeed63d11538f97731373a5f78c2fb8010ca0e82d79abe5dc2e418c8ad77540de2bbed
http://click.harborfreightemail.com/?qs=ce9b5b201d24528b96f1767542d65277b12441dce532cbaa229d377340258feae360c9ca8d787150
Find a store near you
http://click.harborfreightemail.com/?qs=321e884f47eeed63ee17bab83b00234f5b8a6d01d499baa5f38555c8109b453eb14d6c73396ccfdb
http://click.harborfreightemail.com/?qs=c9acb577260e20b065c8d1df6579357c05c5ffbf3e2be1ed18928089e38b2bc386083733c1977c08
http://click.harborfreightemail.com/?qs=c9acb577260e20b0a61e91f6158a364fde5cc31b4e3338fb1affa14f1d45a109b23dac51b2cfcceb
http://click.harborfreightemail.com/?qs=c9acb577260e20b0695079099d4136bc0643139ed6f8b59a89f48bec5830cb52ffa47fdfbd81cfa4
http://click.harborfreightemail.com/?qs=c9acb577260e20b0a28c620fc4643cb7248dd0edda070a818328a27d452a7892c88a6c2ee771fba4
http://click.harborfreightemail.com/?qs=c9acb577260e20b0e9fb8d8824b8897205c0c38f08a713b360d3bf87daf265ad4cc6659a3b0bd47c
http://click.harborfreightemail.com/?qs=c9acb577260e20b036553c90d6dba6a7fbdf9fa8863c8263d5e528201d73c01c45ab1e7e30ab78d8
http://click.harborfreightemail.com/?qs=c9acb577260e20b0bc272426bacf54c1d034746b6da639ca50c880eccfb4e2442ff385f8414f99b5
http://click.harborfreightemail.com/?qs=c9acb577260e20b063515df36022a44f33ce5f392aa5f860715cbdde4acebe8eb754a64926fbf414
http://click.harborfreightemail.com/?qs=c9acb577260e20b044038420651d200357f331082fd7e08784b8c0c58ca9c74ae9940d97973783c7
http://click.harborfreightemail.com/?qs=c9acb577260e20b085de5f8aee36669f87b49c6d9608014f95b6a3d96505f723e209501a1d76635e
http://click.harborfreightemail.com/?qs=3c508c744bf06a47c7888e41e1d5eb4a87c5156b7873d47b835f0ddf593724cb5a53574067fcb070
http://click.harborfreightemail.com/?qs=3c508c744bf06a4724daa8919097a6a1ccf64b2fbb6704c232d60ab1c6a3fb61f0e481dc80123fef
http://click.harborfreightemail.com/?qs=3c508c744bf06a47c0e945dbd1a336329540dbf4a0792582fd1d4a9c17d7ca318c2e597911d78958
http://click.harborfreightemail.com/?qs=3c508c744bf06a47ac3c93927d3dbf395d4c3ddce4ad8bdf33f04485103da2b86f8c8d929d433b36
http://click.harborfreightemail.com/?qs=3c508c744bf06a47e4d50e94e2251a638557e6600540b1b7702b505dc65b0d668e913c48de6b9fd3
91204098
http://click.harborfreightemail.com/?qs=3c508c744bf06a47e4d50e94e2251a638557e6600540b1b7702b505dc65b0d668e913c48de6b9fd3
http://click.harborfreightemail.com/?qs=3c508c744bf06a4703c5584030109201fae881a262c2e5bc3920f0a961fdc103ec82d82e1afd1dc5
http://click.harborfreightemail.com/?qs=c9acb577260e20b0a28c620fc4643cb7248dd0edda070a818328a27d452a7892c88a6c2ee771fba4
Links
http://click.harborfreightemail.com/?qs=3c508c744bf06a47e72eff6a9e6767a5d6b2eb97f2edbb2bcc01b7ed0d9f33576dc272d4af585f9a
Customer Service
http://click.harborfreightemail.com/?qs=3c508c744bf06a477e2910cb09f4967069deecfa95694ebabf88e1831e6c320f985c612a081d47bf
Store Locator
http://click.harborfreightemail.com/?qs=3c508c744bf06a47c0393e26cbea0d08e94ae2e2d1b01d733f80b3a8c0719e5a85b5bf679445346b
Current Ad
http://click.harborfreightemail.com/?qs=3c508c744bf06a4710ac5a0620f9620ef64056d5535b82229f3243a4526cf7b20b483c3561016307
How to Use Coupons
http://click.harborfreightemail.com/?qs=a223c2a74b5eccbc6662cf1c57fd9e72da284ab61e51c74d9d627e7f96e4948209ec0ce8eb29c9a4
Buy Gift Cards
http://click.harborfreightemail.com/?qs=a223c2a74b5eccbc50a6f360b89e73718e39d86e96a49d23109aa0d5289ebbe081cc8e21267e4523
Unsubscribe
Top Categories
http://click.harborfreightemail.com/?qs=a223c2a74b5eccbcf19c2ac1fedf30eef3245f0fe92c4ec8754cb371300f10635adc60c1dd2d9a69
Automotive/Motorcycle
http://click.harborfreightemail.com/?qs=a223c2a74b5eccbc1742b4061a2df2704c8667c574e203b4a6b4295a69adf00276820b44f68a93fb
Garage & Shop
http://click.harborfreightemail.com/?qs=a223c2a74b5eccbc3494784df5d8f37789aee009de90b19aaa23367a3225b743c5292fb03de24979
Power Tools
http://click.harborfreightemail.com/?qs=a223c2a74b5eccbc79068e4e1eeac2688bc4768598d199f7e0e09b58db108d68cced4e9f65cfe900
Air Tools
http://click.harborfreightemail.com/?qs=a223c2a74b5eccbc40c2351271fbac638e11c5bfe31ef437e257e1746eb9f0c7bc021c6c54f5a822
Engines & Generators
http://click.harborfreightemail.com/?qs=a223c2a74b5eccbc91ab1eb6d655e45951c822049b7718091cc41c6daf3dff9d1134b7320ad66054
Hand Tools
http://click.harborfreightemail.com/?qs=a223c2a74b5eccbc6bbe3f1e6248c6efbdf66cd7e98d943118a970beb31a0991be49e070a1360df1
Shop
http://click.harborfreightemail.com/?qs=321e884f47eeed6384b8ccfb2352499a9e0d9c0291d19d51f9a2bc07150f367134d6a8ccfd4c9d99
www.HarborFreight.com or Call 1-800-423-2567 to OrderStay Connected with HFT :
http://click.harborfreightemail.com/?qs=a223c2a74b5eccbc4d7dab275da13c808df2942942c17296b0a99a821fe97257fc80393b777d9d88
http://click.harborfreightemail.com/?qs=ce9b5b201d24528b2608a82d84f00abcb281a8574789efc680c7768d2ece3de11da527b27e230f28
http://click.harborfreightemail.com/?qs=ce9b5b201d24528b4e56fba6ff11a4e9194e866071a13bbca49abeee9f7510c78a942159c8b8edf9
http://click.harborfreightemail.com/?qs=ce9b5b201d24528b4edf2af74f775529a3912d7c7b91cf8799e9dda1a560bffe5bec93dbf0a0d0fb
PRICES- Although we make every effort to assure that our prices, products and coupons are advertised as accurately as possible, we are only human, and in the event an error is made, we reserve the right to correct it. To receive the coupon prices from this email online, the coupon code(s) must be entered into your shopping cart.
Harbor Freight Tools | 26541 Agoura Road | Calabasas, CA 91302 | 1-800-444-3353


--- layout: post title: "Adding DISQUS comments." comments: yes permalink: /:title/ tags: [mastodon] ---
Installation of [DISQUS](https://disqus.com/) for this blog. Updates my disqus account, on my site which has the [Beautiful Jekyll](https://beautifuljekyll.com/) Theme uncomment the disqus line in _config.yml and add my Disqus short name from the General Page on my Disqus account. I want to allow comments on this post I add comments: yes to my front matter.
Hope it works.


None
Cooked Sushi Rice 80% (Corn syrup, Water, Fermented Rice extract (Rice Alcohol, Salt, Acid E330), Distilled Vinegar, Preservatives (E211, E202), Salt, Spirit vinegar (rice and sake cake extract), Avocado 4%, Seaweed, Gari (Ginger, Water, Salt, Acids: E260 and E330, Preservative: E202, Sweeteners: E951, E955 and E954, E621)


Overview — MoreRecipes Api
Welcome to the MoreRecipes API documentation. This is the API used by the MoreRecipes web interface, so everything the web ui is able to do can also be accomplished via the API.
This API provides the means for you to share, view and manage your recipes and those of others.
BASE API URL:
https://more-recipes.herokuapp.com/api/v1/
Making Request
An authorization token is required to access all endpoints except the signup and Login endpoints. Use the login/signup endpoint to get a token
A token generated expires 48 hours after it has being generated.
The token can be placed in req.headers
, req.body
or req.query
token: averylongrandom.jsonwebtokenstring.requiredforauthentication
Returning a list of items
All our api endpoints that returns a list of items are paginated by default, the response body includes pagination metadata which is described below. The pagination can be controlled using the query parameters page and limit
Query Parameters
| Parameter | Default | Description |
|---|---|---|
| page | 1 | The page number |
| limit | 12 | The max number of items per page |
Pagination Metadata
| key | Description |
|---|---|
| pages | An array of all page numbers |
| totalCount | Total number of items in the database |
| pageSize | The number of items returned for a page |
| page | The current page |
| last | The last page available |
User
User signup
Request Body
{
"user": {
"fullname": "William Olojede",
"email"<EMAIL_ADDRESS>"password": "password"
}
}
Response Body
{
"status": "success",
"message": "Account created",
"user": {
"id": 29,
"email"<EMAIL_ADDRESS>"fullname": "William Olojede",
"updatedAt": "2018-01-12T10:31:54.659Z",
"createdAt": "2018-01-12T10:31:54.659Z",
"username": null,
"imgUrl": null
},
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7ImlkIjoyOX0sImlhdCI6MTUxNTc1MzExNCwiZXhwIjoxNTE1NzU2NzE0fQ.sG-zNYLLSMTm6MtuhQ3XGZuTzsMqykeZSSzROkUvkNw"
}
Creates a new user
HTTP Request
- Endpoint:
/users/signin
- Verb:
POST
- Body:
(application/json)
HTTP Response
- StatusCode:
201 - Created
- Body:
(application/json)
User login
Request Body
{
"user": {
"email"<EMAIL_ADDRESS>"password": "password"
}
}
Response Body
{
"status": "success",
"message": "You are successfully logged in",
"user": {
"id": 29,
"username": null,
"email"<EMAIL_ADDRESS>"fullname": "William Olojede",
"imgUrl": null,
"createdAt": "2018-01-12T10:31:54.659Z",
"updatedAt": "2018-01-12T10:31:54.659Z"
},
"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7ImlkIjoyOX0sImlhdCI6MTUxNTc1Mzg2MywiZXhwIjoxNTE1NzU3NDYzfQ.KTXHD-SDIpJr_I5hixbm9R2OJtttDH1IKK58bCwGykE"
}
Logs in user
HTTP Request
- Endpoint:
/users/login
- Verb:
POST
- Body:
(application/json)
HTTP Response
- StatusCode:
200
- Body:
(application/json)
User profile
Response Body
{
"status": "success",
"message": "user found",
"user": {
"id": 29,
"username": null,
"email"<EMAIL_ADDRESS>"fullname": "William Olojede",
"imgUrl": null,
"createdAt": "2018-01-12T10:31:54.659Z",
"updatedAt": "2018-01-12T10:31:54.659Z"
}
}
Gets user profile
HTTP Request
- Endpoint:
/users/:uid
- Verb:
GET
- Body:
(application/json)
HTTP Response
- StatusCode:
200
- Body:
(application/json)
User profile update
Request Body
{
"update": {
"fullname": "William I. Olojede"
}
}
Response Body
{
"status": "success",
"message": "User Details updated successfully",
"user": {
"id": 11,
"username": null,
"email"<EMAIL_ADDRESS>"fullname": "William I. Olojede",
"imgUrl": null,
"createdAt": "2017-11-09T09:07:48.853Z",
"updatedAt": "2018-01-24T09:06:12.841Z"
}
}
Update the details of a user
HTTP Request
- Endpoint:
/users/:uid
- Verb:
PUT
- Body:
(application/json)
:uid
:user id
HTTP Response
- StatusCode:
200
- Body:
(application/json)
User Favorite list
Response Body
{
"status": "success",
"recipes": [
{
"id": 1,
"name": "Jollof Rice",
"description": "some random description",
...
"createdAt": "2017-11-17T10:51:14.594Z",
"updatedAt": "2017-11-17T10:51:14.594Z",
"owner": 8
},
...
],
"pagination": {
"pages": [
1,
2
],
"totalCount": 21,
"pageSize": 12,
"page": 1,
"last": 2
}
}
Gets a paginated list of all recipes favorited by a user
HTTP Request
- Endpoint:
/users/:uid/favorites
- Verb:
GET
- Body:
(application/json)
HTTP Response
- StatusCode:
200
- Body:
(application/json)
User Recipes List
Response Body
{
"status": "success",
"recipes": [
{
"id": 1,
"name": "Jollof Rice",
"description": "some random description",
...
"createdAt": "2017-11-17T10:51:14.594Z",
"updatedAt": "2017-11-17T10:51:14.594Z",
"owner": 8
},
...
],
"pagination": {
"pages": [
1,
2
],
"totalCount": 21,
"pageSize": 12,
"page": 1,
"last": 2
}
}
Gets a paginated list of all recipes created by a user
HTTP Request
- Endpoint:
/users/:uid/favorites
- Verb:
GET
- Body:
(application/json)
HTTP Response
- StatusCode:
200
- Body:
(application/json)
Recipes
Create recipe
Request Body
{
"recipe": {
"name": "very delicious dish",
"description": "This is the recipe for a very delicious dish",
"img_url": "https://imgurlfordish.com/verydelicousdish.jpg",
"ingredients": [
"ingredient 1",
"ingredient 2"
],
"instructions": [
"This is the first step in cooking this delicious dish",
"This is the next step"
]
}
}
Response Body
{
"recipe": {
"upVoteCount": 0,
"downVoteCount": 0,
"favoriteCount": 0,
"viewCount": 0,
"id": 5,
"name": "very delicious dish",
"description": "This is the recipe for a very delicious dish",
"img_url": "https://imgurlfordish.com/verydelicousdish.jpg",
"ingredients": [
"ingredient 1",
"ingredient 2"
],
"instructions": [
"This is the first step in cooking this delicious dish",
"This is the next step"
],
"owner": 29,
"updatedAt": "2018-01-12T13:21:52.287Z",
"createdAt": "2018-01-12T13:21:52.287Z"
},
"message": "recipe created successfully",
"status": "success"
}
Creates a new recipe
HTTP Request
- Endpoint:
/recipes
- Verb:
POST
- Requires Token: True
HTTP Response
- StatusCode:
201: Created
- Body:
(application/json)
Get all recipes
Response body
{
"recipes": [
{
"id": 27,
"name": "very delicious dish",
"description": "This is one of my 'go to' recipes ",
...
"User": {
"id": 11,
"username": null,
"fullname": "Email Mail"
}
},
...
{
"id": 28,
"name": "very delicious dish",
"description": "This is one of my 'go to' recipes ",
...
"User": {
"id": 11,
"username": null,
"fullname": "Email Mail"
}
}
],
"pagination": {
"pages": [
1,
2,
...
10,
11,
12
],
"totalCount": 139,
"pageSize": 12,
"page": 1,
"last": 12
},
"status": "success"
}
HTTP Request
- Endpoint:
/recipes
- Verb:
GET
HTTP Response
- StatusCode:
200: Ok
- Body:
(application/json)
Query Parameters
| Parameter | Values | Description |
|---|---|---|
| sort | upvotes | Sort by criteria |
| order | descending | Direction of ordering |
Get a recipe
Response Body
{
"recipe": {
"id": 35,
"name": "very delicious dish",
"description": "This is the recipe for a very delicious dish",
"img_url": "https://imgurlfordish.com/verydelicousdish.jpg",
"ingredients": [
"ingredient 1",
"ingredient 2"
],
"instructions": [
"This is the first step in cooking this delicious dish",
"This is the next step"
],
"upVoteCount": 0,
"downVoteCount": 0,
"favoriteCount": 0,
"viewCount": 1,
"createdAt": "2017-11-11T09:07:14.446Z",
"updatedAt": "2018-01-12T14:05:39.097Z",
"owner": 11,
"User": {
"id": 11,
"username": null,
"fullname": "Email Mail"
}
},
"status": "success"
}
HTTP Request
- Endpoint:
/recipes/:id
- Verb:
GET
:id
:recipe id
HTTP Response
- StatusCode:
200: Ok
- Body:
(application/json)
Add review on recipe
Request Body
{
"content": "Whoever told u that u can cook is a bloody liar"
}
Response Body
{
"status": "success",
"reviews": [
{
"id": 86,
"content": "Whoever told u that u can cook is a bloody liar",
"createdAt": "2018-01-13T00:41:59.673Z",
"User": {
"id": 29,
"username": null,
"fullname": "William Olojede"
}
},
...
],
"pagination": {
"pages": [
1,
2,
3
],
"totalCount": 30,
"pageSize": 12,
"page": 1,
"last": 3
},
"message": "Your review has been recorded"
}
HTTP Request
- Endpoint:
/recipes/:id/reviews
- Verb:
POST
:id
:recipe id
HTTP Response
- StatusCode:
201: Created
- Body:
(application/json)
Get all reviews for a recipe
Response Body
{
"status": "success",
"reviews": [
{
"id": 84,
"content": "dude really???",
"createdAt": "2018-01-09T03:33:40.835Z",
"User": {
"id": 27,
"username": null,
"fullname": "Ajale Aj"
}
},
...
{
"id": 83,
"content": "shit sucks3",
"createdAt": "2018-01-09T03:27:25.255Z",
"User": {
"id": 27,
"username": null,
"fullname": "Ajale Aj"
}
}
],
"pagination": {
"pages": [
1,
2,
3
],
"totalCount": 29,
"pageSize": 12,
"page": 1,
"last": 3
}
}
HTTP Request
- Endpoint:
/recipes/:id/reviews
- Verb:
GET
:id
:recipe id
HTTP Response
- StatusCode:
200: Ok
- Body:
(application/json)
Modify a recipe
Request Body
{
"update": {
"name": "some random very delicious dish"
}
}
Response body
{
"status": "success",
"message": "Recipe updated successfully",
"recipe": {
"id": 169,
"name": "some random very delicious dish",
"description": "This is the recipe for a very delicious dish",
...
"createdAt": "2018-01-13T00:09:15.646Z",
"updatedAt": "2018-01-13T00:10:48.024Z",
"owner": 29
}
}
HTTP Request
- Endpoint:
/recipes/:id
- Verb:
PUT
:id
:recipe id
- Must be owner
HTTP Response
- StatusCode:
200: Ok
- Body:
(application/json)
(up, down)Vote a recipe
Response body — downVote
{
"recipe": {
"id": 169,
"name": "some random very delicious dish",
"description": "This is the recipe for a very delicious dish",
...
"upVoteCount": 0,
"downVoteCount": 1,
"favoriteCount": 0,
"viewCount": 1,
"createdAt": "2018-01-13T00:09:15.646Z",
"updatedAt": "2018-01-13T00:13:58.362Z",
"owner": 29
},
"status": "success",
"message": "You disliked this recipe"
}
Response body — upVote
{
"recipe": {
"id": 169,
"name": "some random very delicious dish",
"description": "This is the recipe for a very delicious dish",
"img_url": "https://imgurlfordish.com/verydelicousdish.jpg",
...
"upVoteCount": 1,
"downVoteCount": 0,
"favoriteCount": 0,
"viewCount": 1,
"createdAt": "2018-01-13T00:09:15.646Z",
"updatedAt": "2018-01-13T00:17:57.324Z",
"owner": 29
},
"status": "success",
"message": "You liked this recipe"
}
HTTP Request
- Endpoint:
/recipes/:id/vote-{up, down}
- Verb:
POST
:id
:recipe id
HTTP Response
- StatusCode:
200: Ok
- Body:
(application/json)
Favorite a recipe
Response body
{
"recipe": {
"id": 2,
"name": "Jollof Rice",
...
"upVoteCount": 0,
"downVoteCount": 0,
"favoriteCount": 3,
"viewCount": 5,
"createdAt": "2017-10-23T08:08:47.566Z",
"updatedAt": "2018-01-13T00:34:03.699Z",
"owner": 2
},
"status": "success",
"message": "Recipe added to your favorite list"
}
HTTP Request
- Endpoint:
/recipes/:id/favorite
- Verb:
POST
:id
:recipe id
HTTP Response
- StatusCode:
200: Ok
- Body:
(application/json)
Delete Recipe
Response body
{
"status": "success",
"message": "Recipe deleted successfully"
}
HTTP Request
- Endpoint:
/recipes/:id
- Verb:
DELETE
:id
:recipe id
- Must be owner
HTTP Response
- StatusCode:
200: Ok
- Body:
(application/json)
Errors
The MoreRecipes API uses the following error codes:
| Error Code | Meaning |
|---|---|
| 400 | Bad Request |
| 401 | Unauthorized |
| 403 | Forbidden |
| 404 | Not Found |
| 500 | Internal Server Error |


{% set page = { title: 'Design Page', layout: prototype.current.layoutPath + 'layout_admin.html', dev: true, nav: { maxwidth: true } } %} {% extends page.layout %} {% block main %} {{ prototype.current.layoutPath | log }}
This is what your employer will see.
Check it through. If you need to change it or find bits that you don't want to share with your employer you can go change it.
Once you are happy with it you can approve it.


I have complete Python courses and also during my internship I used Python to build internship Project.
I have deep understanding of C and C++ language. I am good at data structure and algorithms.
I have a good knowledge of SQL and DBMS concept. I have successfully complete my mini-project using MySQL.
I have basic understanding of HTML and CSS. I build light weight Web pages using these languages


 Put this where you want the chart to show up:

This is the code that generates the chart - it should be placed AFTER the

tag:


{% include head.html %}
{% include header.html %}
{% include about.html %}
{% include skills2.html %}
{% include skills.html %}
{% include projects.html %}
{{ content }} {% include footer.html %}


#include <BotA_HashTable.h>
Public Member Functions | |
| BotA_HashTable (int length) | |
| virtual bool | isPresent (const Node *node) const |
| int | getHeapStackCell (const Node *node) |
| bool | changeHeapStackCell (const Node *node, const int newHeapStackCell) |
| BotA_HashTable::BotA_HashTable | ( | int | length | ) |
Constructor for new node
| treeNode | treeNode to be stocked on this item |
| bool BotA_HashTable::isPresent | ( | const Node * | node | ) | const [virtual] |
| int BotA_HashTable::getHeapStackCell | ( | const Node * | node | ) |
Get the heapStackCell value (cell number of node in the heapStack) from a node in the hashTable
| node | node we want to get value |
| bool BotA_HashTable::changeHeapStackCell | ( | const Node * | node, | |
| const int | newHeapStackCell | |||
| ) |
change the heapStackCell value (cell number of node in the heapStack) from a Node in the hashTable
| node | node we want to change value | |
| newHeapStackCell | new heap stack cell to assign to this node |


--- layout: post title: "editing echoserver #1 - structure problem" ---
I started clearing the class structure in the echoserver code. But it is very difficult because I'm not sure some decisions are right or not at the time I decide.
So...I first thought that session should be independent. But I had no idea whether the structure and role of session class are right or not. At that time I thought, "if session could be replaced by the mock object, that's right."
So now I downloaded the Catch2 - unittest framework framework for C++ - and am attaching the Catch2 header files to the project.
I'll spend much time to adapt unittest to the project, but I'm studying! I'll do my best - although it's a part-time study? haha - and make it good.


|
Wallaroo
0.8
|
#include <part.h>
Public Member Functions | |
| virtual | ~Part () |
| void | Wire (const std::string &dependency, const cxx0x::shared_ptr< Part > &part) |
| template<typename T > | |
| void | SetAttribute (const std::string &attribute, const T &value) |
| bool | MultiplicitiesOk () const |
| virtual void | Init () |
| template<> | |
| void | SetAttribute (const std::string &attribute, const std::string &value) |
Protected Member Functions | |
| RegToken | RegistrationToken () |
Friends | |
| template<class T1 , class T2 > | |
| class | Class |
| template<typename T , typename P , template< typename X > class Ownership> | |
| class | Collaborator |
| template<class T > | |
| class | Attribute |
This class represents a "part" that owns dependencies (collaborators) and attributes. You can link its dependencies to other parts using the method Part::Wire and assign a value to its attributes using the method SetAttribute, but wallaroo provides mechanisms more flexible for these tasks (i.e., the DSL constructs "use().as().of()" and "set_attribute().of().to()" and the configuration files).
|
inlinevirtual |
|
inlinevirtual |
This method get called by Catalog::Init(). If you have work to be done for the initialization of your class, you should implement this method in the derived class. This is useful if you want to do your initialization after collaborators are been wired and attributes set. Keep in mind that in the constructor the wiring has not be performed yet.
|
inline |
Check the multiplicity of its collaborators.
|
inlineprotected |
|
inline |
Assign a value to an attribute of the Part.
| attribute | The name of the attribute. |
| value | The value to assign. |
| ElementNotFound | If attribute does not exist in this part. |
| WrongType | If value has not a type compatible with the attribute. |
|
inline |
Assign a value to a string attribute of the part.
| attribute | The name of the attribute. |
| value | The value to assign. |
| ElementNotFound | If attribute does not exist in this part. |
|
inline |
Link the dependency dependency
of this part into the Part part
.
| ElementNotFound | If dependency does not exist in this part. |
| WrongType | If part has not a type compatible with the dependency. |
|
friend |
|
friend |
|
friend |


CrimPapers
Articles published on 18 June 2019
On 18 June 2019, 12 new articles were published in 10 journals.
Street Time Is No Sweet Time: Granting Credit For Time on Parole in Australia by Lorana Bartels, Arie Freiberg
Religious Congregations and Crime Incidents: Opportunity and Bias by Jeffery T. Ulmer, Christopher P. Scheitle
Examining A Ferguson Effect on College Students’ Motivation to Become Police Officers by Weston J Morrow, Samuel G Vickovic, Lisa M Dario, John A Shjarback
The Co-Offender As Counterfactual: A Quasi-Experimental Within-Partnership Approach to the Examination of the Relationship Between Race and Arrest
Young Adult Reflections on the Impact of Parental Incarceration and Reentry by Diane S. Young, Carrie Jefferson Smith
Family Contact in Juvenile Confinement Facilities: Analysis of the Likelihood of and Barriers to Contact by Alyssa M. Mikytuck, Jennifer L. Woolard
The Impact of Disrupted Caregiving For Juvenile Sexual Offenders by Miranda H. Sitney, Keith L. Kaufman
Jared Ahmed (2018). the Bbc, the ‘war on Terror’ and the Discursive Construction of Terrorism. Representing Al-Qaeda
A Private Security Regulation Index: Ranking EU Member States From 1931 Until 2018
Improving Warning Messages Adherence: Can Maya Security Bot Advisor Help?
How Do Terrorist Organizations Make Money? Terrorist Funding and Innovation in the Case of Al-Shabaab by Ido Levy, Abdi Yusuf
How Dark Are Dark Figures? Official and Self-Report Rates of Inmate-on-Inmate Victimization by Teresa Braga, Andreia de Castro-Rodrigues, Silvana Mariadly Severim Di Folca, Rui Abrunhosa Gonçalves


Tramps
Tramps is a movie starring Callum Turner, Grace Van Patten, and Michal Vondel. A young man and woman find love in an unlikely place while carrying out a shady deal.


ABOUT
Kitchen Stories
Press
Team Members
Rishabh Mishra
Vikrant Tiwari
Poonam Yadav
HELP
Payments
Shipping
Cancellation & Returns
FAQ
Return Policy
Terms Of Use
Security
Privacy
Sitemap
Registered Office Address:
Nature kitchen
Phagwara, Jalandhar
Village Phagwara 144111
Near- Lovely Professional University
Punjab, India
Mob: +91<PHONE_NUMBER>